从is(":checked")说起

本文详细解析了在jQuery中如何正确使用attr和prop方法来获取和设置HTML元素的属性值,特别是对于checked等布尔类型的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*此文所用jQuery版本应大于1.6.1
 
如何判断一个单选(复选)框是否选中。
对于刚接触jQuery的人,第一反应必然是。
<input id="checkbox1" type="checkbox" checked>
<input id="checkbox2" type="checkbox>
$("#checkbox1").attr("checked") // checked
$("#checkbox2").attr("checked") // undefined
无论是否选中,返回的值一直是 checked 。(至于为什么返回的是checked,那是因为checked属性对应的值只有checked这一个,所以写什么checked=false,checked="true",checked="unchecked" 这些是毫无意义的。都等同于checked="checked",可以参考文档 input标签)
 
回到正题,我们希望的结果肯定是,如果选中了就返回true,没选中就返回false。
如果对jQuery比较熟悉,一般会这么处理
<input id="checkbox1" type="checkbox" checked>
<input id="checkbox2" type="checkbox>
$("#checkbox1").is(":checked") // true
$("#checkbox2").is(":checked") // false
用is方法传入:checked伪类选择器,解决了这个问题。但是,为什么第一种方法不行呢?
 
 
 
二、HTML元素属性 和 DOM节点属性
会造成上面问题的疑问,主要原因是一个html元素,有两种类型属性(不知道这样说是否准确,但是个人认为比较好理解)
 
一种是DOM节点属性,读取它的方法就是 attr() 方法,拿个input来说
<input id="checkbox1" type="checkbox" checked data-custom='customattribute'>
这个input有的4个dom节点属性 id、type、checked、data-custom。
所以通过attr方法可以拿到这4个属性的值(值和html中写的一样,其中checked的值就是checked,原因上面已解释)
如果你写不存在的属性,返回的就会是undefined。
 
第二种是HTML元素属性,这种属性你看不到,但是确实存在,而且大部分情况和DOM节点属性对应的值一样。
在jQuery中取得这种值的方法是 prop();
看下这个例子就明了了
<input id="checkbox1" type="checkbox" checked data-custom='customattribute'>
$("#checkbox1").prop("id") //checkbox1
$("#checkbox1").prop("type") //checkbox
$("#checkbox1").prop("checked") //true
$("#checkbox1").prop("data-custom") // undefined 自定义的DOM节点属性用取HTML元素属性的方法是取不到的
id和type和attr方法返回的一样。但是checked方法返回的值就不一样了,因为DOM节点属性可以理解为静态的,当页面渲染完,checked属性就确定了,就是checked。而HTML元素属性是动态的,随时可以改变,而且对于checked这个属性,对应的值是true或者false。
 
同理,a标签的href属性,用prop和attr取出来的也有可能不一样。attr取出的和看到的一样,prop取出的会是完整路径
<a id="a" href="test.html" class="csstest" style="font-size: 30px;">link</a>
$("#a").attr("href") // test.html
$("#a").prop("href") // "file:///E:/jquery/test.html"
所以,回到最开始的问题。
自然而然有另外一种解决方法
<input id="checkbox1" type="checkbox" checked>
<input id="checkbox2" type="checkbox>
$("#checkbox1").prop("checked") // true
$("#checkbox2").prop("checked") // false
 
现在,这个问题应该已经很明了了。不过attr和prop不仅支持读取属性的操作,还支持写入属性的操作,我简单测试了下,发现在写入方面,attr和prop似乎差别不大。应该是jQuery做了兼容吧。
 
 
 
三、从原生Javascript看根本区别
简而言之把。attr相当于 Element.getAttribute / Element.setAttribute 而 prop相当于 Element['name'] / Element.name 这样。
就好比 
<a id="a" href="test.html" class="csstest" style="font-size: 30px;">link</a>
document.getElementById("a").getAttribute("style")  // font-size: 30px;
document.getElementById("a").style // CSSStyleDeclaration {0: "font-size", parentRule: null, length: 1, cssText: "font-size: 30px;", alignContent: "", alignItems: ""…}   一种浏览器定义的对象

 

 

转载本站文章请注明作者和出处 奇葩一朵朵 – http://www.cnblogs.com/season-huang/ ,请勿用于任何商业用途

转载于:https://www.cnblogs.com/season-huang/p/3360869.html

<think>好的,用户现在询问的是关于a:checked的用法、示例和解释。首先,我需要确认用户的需求。用户可能在前端开发中遇到了问题,或者想了解如何正确使用这个CSS伪类选择器。首先,我得回顾一下CSS中的:checked伪类。通常,:checked用于匹配被选中的表单元素,比如复选框(checkbox)、单选按钮(radio)或者下拉选项(option)。但用户提到的是a:checked,这里可能存在误解,因为<a>标签是超链接,通常不具备checked属性,除非被手动添加或者通过JavaScript动态设置。因此,我需要确认用户是否真的想将:checked应用于<a>标签,或者是否存在拼写错误,比如原本应该是input:checked。 接下来,参考用户提供的引用内容,特别是引用[4],其中提到了CSS的:checked伪类选择器用于复选框。这说明用户可能混淆了标签类型。因此,在回答中需要指出,a:checked通常无效,并解释正确的用法。然后,我需要考虑用户可能的实际应用场景。例如,用户可能希望当某个链接被点击后改变样式,但这通常需要通过JavaScript添加类来实现,而不是使用:checked伪类。因此,在示例部分,应该展示正确的使用方式,比如针对复选框或单选按钮,并说明如何通过CSS控制它们的样式。 此外,用户提供的引用中有关于jQuery处理checked属性的例子(引用[1]),以及Java异常处理(引用[2][3]),但这些可能与当前问题无关。需要专注于CSS部分,引用[4]中的内容更相关,应重点参考。最后,生成相关问题时要围绕:checked的用法、常见错误、替代方案等,帮助用户深入理解。同时,确保回答结构清晰,分点解释,提供正确的代码示例,并指出常见的误区,比如在<a>标签上使用:checked的问题。</think>### 关于 `a:checked` 的用法解析 #### 1. **核心概念澄清** - **`:checked` 伪类的作用**:用于匹配表单元素中被选中的状态,例如复选框(`<input type="checkbox">`)、单选按钮(`<input type="radio">`)或 `<option>` 元素[^4]。 - **`a:checked` 的误区**:`<a>` 标签是超链接元素,本身**不支持 `checked` 属性**,因此 `a:checked` 在标准 CSS 中**无法生效**。若需实现类似效果,需通过 JavaScript 动态添加类或属性。 --- #### 2. **正确用法示例** 若需实现“选中后样式变化”,可参考以下两种场景: ##### 场景1:针对复选框/单选按钮 ```html <style> /* 选中时改变背景色 */ input[type="checkbox"]:checked { background-color: #4CAF50; } </style> <input type="checkbox"> 勾选我 ``` ##### 场景2:通过 JavaScript 模拟 `<a>` 标签的选中状态 ```html <style> .active-link { color: red; font-weight: bold; } </style> <a href="#" onclick="this.classList.toggle('active-link')">点击切换选中状态</a> ``` --- #### 3. **常见问题与解决** - **问题**:误用 `a:checked` 导致样式不生效。 - **解决方案**: 1. **检查元素类型**:确保目标元素支持 `checked` 属性(如复选框)。 2. **动态类切换**:通过 JavaScript 的 `classList` 或属性操作实现类似效果[^1][^4]。 3. **属性选择器替代**:若需匹配自定义属性(如 `data-checked`),可使用 `a[data-checked="true"]`。 --- #### 4. **扩展应用示例** 结合 CSS 和 JavaScript 实现导航栏高亮: ```html <style> .nav-link.active { border-bottom: 2px solid blue; } </style> <a class="nav-link" onclick="setActive(this)">首页</a> <a class="nav-link" onclick="setActive(this)">关于</a> <script> function setActive(element) { document.querySelectorAll('.nav-link').forEach(link => link.classList.remove('active')); element.classList.add('active'); } </script> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值