attr()和prop()的前世此生

attr(全称为attribute),prop(全称为property),二者均可以翻译为属性,为了区分两者,有些中文文档将前者翻译为特性,后者翻译为属性。简单地说,attr表示HTML标签的属性,而prop表示DOM对象的属性。两者从本质上来讲是不同的,但它们经常被混为一谈,部分缘由在于DOM对象的属性大多与其所对应的HTML属性同名,好比id,href,type,但也有不一样,好比DOM对象中有className属性,而HTML标签中有class属性。
    
    在jquery的在早期版本中,没有区分出attr和prop,只有一个attr()。jQuery 1.6版本,提供了一个新的方法来获取和设置属性,这个方法这是prop()。在此以前,prop()的职能只能由attr()代为行使。官方建议,对于只有true和false两个值的属性(如checked、selected、disabled等),应当使用prop()。若是你恰恰就不听建议,就是要用attr(),那么让咱们看下有什么后果(此处以checked为例)。

    这是HTML代码:
<input type="checkbox" id="check1">
<label for="check1">Check me</label>

    这是jQuery代码:

$(function(){
    $("input").change(function(){
        console.log($(this).attr("checked"));
        console.log($(this).prop("checked"));
        });
    });
 
    在不一样的jquery版本下,有不一样的输出结果,以下面的表格所示:

各个jquery版本下的输出结果

分析:
    从上面能够看出,1.6版本以前,使用attr()能获得正确的结果,而使用prop()会返回类型错误(由于该方法尚未被定义);从1.6.0版本起,attr()获得的结果都不符合预期,而使用prop()能够获得正确的结果。能够简单地理解为,从1.6.0版本起,attr()让出了那些本不属于本身的权力,而prop()得到了它的权力(这就像古代的摄政王要在皇帝大婚以后将皇权交回皇帝手中同样)。所以,咱们仍是要遵循官方的建议,该用prop()的地方就不要再用attr()了。

总结:
    应该用prop()获取的属性以下:async,autofocus,checked,location,multiple,readOnly,selected。

本文中部分观点为我的理解,不当之处,敬请批评指正
参考文档:http://api.jquery.com/prop/
相关文章
相关标签/搜索