JQuery 1.6中removeProp和removeAttr有什么区别?

时间:2011-05-05 07:39:09

标签: javascript jquery

如果你删除某些东西,你应该使用removeAttr,它会无声地失败吗?它会起作用吗?它实际上会删除整个属性还是只删除其中的值?

如果使用prop()添加'checked',是否可以使用removeAttr删除它?

很多问题!

3 个答案:

答案 0 :(得分:7)

official jQuery blog提供了非常明确的解释:

  

在1.6版本中我们分开了   处理DOM属性和DOM   属性分为单独的方法。该   新的.prop()方法设置或获取   DOM元素的属性,和   .removeProp()删除属性。在   过去,jQuery还没有说清楚   属性和。之间的界限   属性。通常,DOM属性   表示DOM信息的状态   从文档中检索出来的   作为标记中的value属性   。 DOM   属性表示动态   该文件;例如,如果   用户点击上面的输入元素   和类型def .prop("value")是   abcdef但.attr("value")仍然存在   ABC

     

在大多数情况下,浏览器会对待   属性值作为起始值   对于属性,但布尔值   属性,如已选中或已禁用   有不同寻常的语义。

     

例如,考虑标记   <input type="checkbox" checked>。该   存在已检查的属性   表示DOM .checked属性   是的,即使是属性   没有价值。在代码中   上面,检查的属性值是   空字符串(如果没有,则为undefined   属性已指定)但是   已检查的属性值为true

     

在jQuery 1.6之前,.attr("checked")   返回了Boolean属性值   (true)但是从jQuery 1.6开始它返回   属性的实际值(an   空字符串),不会改变   当用户单击复选框时   改变它的状态。

     

有几种选择   检查当前检查的状态   一个复选框。最好也是最好的   performant是使用DOM属性   直接,如在this.checked里面   这引用时的事件处理程序   被点击的元素。在代码中   使用jQuery 1.6或更新版本的新版本   方法$(this).prop("checked")   检索与...相同的值   this.checked并且相对较快。   最后,表达   $(this).is(":checked")适用于所有人   jQuery的版本。

答案 1 :(得分:4)

元素的属性类似于“类”。而它的财产将是'className'。

这就是将jQuery.prop和jQuery.propHooks添加到1.6版本中的原因,以便更轻松地使用它们。

因此,如果该属性与该属性具有相同的名称,则可以同时使用removeProp或removeAttr。

我在jQuery论坛上问了一个类似的问题,得到了这个答案:

  

是的,attr适用于html属性   因为它们是严格定义的。道具是   对于属性。例如,比如说   你有一个节点elem与类   “某事”(原始元素不是jQuery   宾语)。 elem.className是   财产,但是在哪里   属性驻留。改变班级   属性也会更改属性   自动反之亦然。   目前,attr是乱七八糟的   令人困惑,因为它已经尝试过   这两个职能的工作都有   因为这个很多错误。该   jQuery.fn.prop的介绍会   解决几个拦截器,单独的代码   因为它本应该被分开   一开始,给开发者   更快的功能来做他们的事   期待他们这样做。我来弥补一个   一秒钟的百分比,并说来自   我在支持IRC和支持方面的经验   阅读其他代码,95%的使用   attr的情况不必切换   支持。

修改

最好坚持使用jQuery.attr或jQuery.prop。当使用两者设置和删除checked属性时,似乎有些奇怪的行为。

请点击此处查看示例:http://jsfiddle.net/tomgrohl/uTCJF/

1.6中存在与选定内容相关的错误:http://bugs.jquery.com/ticket/9079

答案 2 :(得分:0)

使用jQuery 1.6,我试图克隆一个具有多个id属性的菜单项,所以我这样做了:

$('ul.menu').clone().filter('*').removeProp('id').appendTo('.sidebar');

当我检查Firebug中的元素时,我有很多id="undefined" - 而不是我想要的。所以现在我正在使用removeAttr,它似乎工作得更好。

$('ul.menu').clone().filter('*').removeAttr('id').appendTo('.sidebar');