jQuery的attr方法和prop方法的区别及相关bug处理

以下是jQuery API文档对attr方法和prop方法的概述:

attr(name|properties|key,value|fn):Get the value of an attribute for the first element in the set of matched elements or set one or more attributes for every matched element.(获取匹配元素集合中的第一个元素的属性值,或为每一个匹配元素设置一个或多个属性)

prop(name|properties|key,value|fn):Get the value of a property for the first element in the set of matched elements or set one or more properties for every matched element.(获取匹配元素集合中的第一个元素的属性值,或为每一个匹配元素设置一个或多个属性)

纳尼?!!!这不是坑我吗,官网给出两种方法的解释几乎相差无几,在以前,一般操作元素的属性值时,我都用attr,直至出现了一个神奇的bug,见以下代码:

$(‘.member_grounp_list li‘).on(‘click‘,function(){
  $this = $(this);
  var _check = $this.find(‘.edit_check‘);
  if(_check.attr(‘checked‘)){
    _check.arrr(‘checked‘,false);
  }else{
    _check.attr(‘checked‘,true);
  }
});

以上代码是对<li>标签绑定了点击事件切换<li>标签里面的chekbox的checked属性,这个时候,神奇的bug就出现了,连续点击<li>标签之后,checkbook只有在第一轮中正确表现出选中和取消选中后,以后checkbook对事件都毫无反应。

接着,我对代码加入打印事件,查看是否是事件只运行到一轮就失效了。

$(‘.member_grounp_list li‘).on(‘click‘,function(){  $this = $(this);  var _check = $this.find(‘.edit_check‘);   if(_check.attr(‘checked‘)){    _check.arrr(‘checked‘,false);    console.log(‘0‘);  }else{    _check.attr(‘checked‘,true);    console.log(‘1‘);  }});

继续连续点击<li>标签,控制台能成功连续切换打印出"0"和"1",然而checkbox经过第一轮后,在表现上依然是一直处于没选中的状态。此时的我一脸懵逼==

google一下,才想起了prop这个方法,对于表单元素自身特有属性操作时,应该使用prop方法。马上改过来试试。

$(‘.member_grounp_list li‘).on(‘click‘,function(){
  $this = $(this);
  var _check = $this.find(‘.edit_check‘);
  if(_check.prop(‘checked‘)){
    _check.prop(‘checked‘,false);
  }else{
    _check.prop(‘checked‘,true);
  }
});

再一次连续点击测试,OK,通过,BUG解决。

总结:对于表单元素特有属性的操作时,应该使用prop方法。而对于其他属性操作,则基本靠attr方法就可以解决。

时间: 2024-12-16 11:16:57

jQuery的attr方法和prop方法的区别及相关bug处理的相关文章

jquery中attr方法和prop方法的区别

关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true"等属性设置,和它的状态值true/false是无关的.,而这里的属性值,事实上只是和defaultChecked的状态值有关,并且只能用来设置checkbox的初始的值.checked的属性值并不会随着checkbox的的状态变化而变化,可是checkbox的状态值却会.因此,为了能更好的跨浏览器的

jquery里的attr()方法和prop()方法的区别

在jq的高版本里出现了prop()方法,那么attr()和prop()的区别在哪呢?这两者分别在什么情况用呢? 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. eg:<a href="http://www.baidu.com" target="_blank">哈哈</a> 像href.target这样的属性是html元素本身就带有的固有属性,在处理时

jquery attr方法和prop方法获取input的checked属性问题

问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性,获取的checked返回值为boolean,选中为true,否则为flase <input type="checkbox" id="selectAll" onclick="checkAll()">全选 function checkAll

详解HTTP请求:get方法和post方法的区别

在讨论get方法和post方法的区别时,我们经常会提到两点: 1.get传送的数据量较小,不能大于2KB,而post传送的数据量较大,一般被默认为不受限制: 2.get安全性非常低,但是post安全性较高: 究其根本,为什么呢?就需要提到http报文以及http报文的格式. 首先我们先看一下HTTP请求报文的通用格式: 在<计算机网络--自顶向下方法>一书中提到很关键的两句话: 使用get方法时实体主体为空,而使用post方法时才使用. HTML表单经常使用GET方法,将输入数据(在表单字段)

2016/05/23 thinkphp M方法和D方法的区别

M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 M方法: 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时 只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用 M方法 甚至可以简单看着就是对参数表名对应的数据表的操作: $User = M('User'); 使用D方法 如果是如下情况,请考虑使

问题:ExecuteNonQuery 与 ExecuteScalar 结果: ExecuteNonQuery方法和ExecuteScalar方法的区别

ExecuteNonQuery方法和ExecuteScalar方法的区别 ----ExecuteNonQuery():执行命令对象的SQL语句,返回一个int类型变量,如果SQL语句是对数据库的记录进行操作(如记录的增加.删除和更新),那么方法将返回操作所影响的记录条数. ----ExecuteScalar():执行命令对象的SQL语句,如果SQL语句是SELECT查询,则仅仅返回查询结果集中的第1行第1列,而忽略 其他的行 和列.该方法所返回的结果为object类型,在使用之前必须强制转换为所

ExtJS中listener方法和handler方法的区别

listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过处理函数一次处理点击响应 Ext.create('Ext.Button', { text : 'Dynamic Handler Button', renderTo: Ext.getBody(), handler : function() { // this button will spit out

ThinkPHP的D方法和M方法的区别

M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 M方法: 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用M方法 甚至可以简单看着就是对参数表名对应的数据表的操作: $User = M('User'); 使用D方法 如果是如下情况,请考虑使用

HTTP PUT方法和POST方法的区别

POST 方法用来传输实体的主体,PUT方法用来传输文件,自身不带验证机制. 这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的.一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源.这个说法本身没有问题,但是并没有从根本上解释了二者的区别.事实上,它们最根本的区别就是:POST方法不是幂等的,而PUT方法则有幂等性.那这又衍生出一个问题,什么是幂等? 幂等(idempotent.idempotence)是一个抽象代数的概念.在计算机中,可以这么理解,一个幂