所以jQuery1.6有了新的函数prop()。

$(selector).click(function(){
    //instead of:
    this.getAttribute('style');
    //do i use:
    $(this).prop('style');
    //or:
    $(this).attr('style');
})

或者在这种情况下,他们会做同样的事情吗?

如果我必须切换到使用prop(),那么如果我切换到1.6,所有旧的attr()调用都会中断?

更新

选择器='#id'$(选择器).click(函数){//而不是:var getAtt=this.getAttribute('style');//我是否使用:var thisProp=$(this).prop('style');//或:var thisAttr=$(this).attr(“样式”);console.log(getAtt、thisProp、thisAttr);});<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js“></script>测试</div>

(另请参见此小提琴:http://jsfiddle.net/maniator/JpUF2/)

控制台将getAttribute作为字符串记录,将attr作为字符串记录但将prop作为CSSStyleDeclaration记录,为什么?这对我未来的编码有何影响?


当前回答

在prop()与attr()中,几乎没有其他注意事项:

selectedIndex、tagName、nodeName、nodeType、ownerDocument、defaultChecked和defaultSelected。。应使用.prop()方法检索和设置。这些属性没有相应的属性,只是财产。输入类型复选框.attr('checked')//返回已检查.prop('checked')//返回true.is(“:checked”)//返回trueprop方法返回选中、选中、禁用或禁用的布尔值,只读。。而attr返回定义的字符串。所以,你可以直接在if条件下使用.prop('checked')。.attr()在内部调用.prop(),因此.attr比直接通过.prop()访问它们慢。

其他回答

DOM中有一个属性;属性在HTML中,该HTML被解析为DOM。

进一步的细节

如果更改属性,则更改将反映在DOM中(有时使用不同的名称)。

示例:更改标记的class属性将更改DOM中该标记的className属性(这是因为类已被使用)。如果标记上没有属性,那么相应的DOM属性仍然为空或默认值。

示例:虽然标记没有class属性,但DOM属性className确实存在空字符串值。

edit

如果您更改一个,另一个将由控制器更改,反之亦然。该控制器不在jQuery中,而是在浏览器的本地代码中。

只是HTML属性和DOM对象之间的区别导致了混淆。对于那些习惯于使用DOM元素的本地财产(比如this.src this.value this.checked等)的人来说,.prop是对这个家庭的热烈欢迎。对其他人来说,这只是增加了一层混乱。让我们澄清一下。

查看.attr和.prop之间差异的最简单方法是以下示例:

<input blah="hello">

$('input').attr('blah'):按预期返回'hello'。这里没有惊喜。$('input').prop('blah'):返回undefined——因为它正在尝试执行[HTMLInputElement].blah——并且该DOM对象上不存在这样的属性。它仅作为该元素的属性存在于作用域中,即[HTMLInputElement].getAttribute('blah')

现在我们改变了一些事情,比如:

$('input').attr('blah', 'apple');
$('input').prop('blah', 'pear');

$('input').attr('beah'):返回'apple'是吗?为什么不“梨”,因为这是最后一个元素。因为属性是在输入属性上更改的,而不是DOM输入元素本身——它们基本上彼此独立工作。$('input').prop('beah'):返回'pear'

您真正需要注意的是,不要因为上述原因而在整个应用程序中混合使用相同的属性。

看到一把小提琴展示了不同之处:http://jsfiddle.net/garreh/uLQXc/


属性与属性:

第1轮:风格

<input style="font:arial;"/>

.attr('style')--返回匹配元素的内联样式,即“font:arial;”.prop('style')--返回一个样式声明对象,即CSSStyleDeclaration

第二轮:价值

<input value="hello" type="text"/>   

$('input').prop('value', 'i changed the value');

.attr('value')--返回'hello'*.prop('value')--返回'i changed the value'

*注意:出于这个原因,jQuery有一个.val()方法,它在内部等同于.prop('value')

在jQuery1.6之前,attr()方法在检索属性时有时会考虑属性值,这会导致相当不一致的行为。

prop()方法的引入提供了一种显式检索属性值的方法,而.attr()检索属性。

文件:

jQuery.attr()获取匹配元素集合中第一个元素的属性值。

jQuery.prop()获取匹配元素集合中第一个元素的属性值。

.attr():

获取匹配元素集合中第一个元素的属性值。为您提供页面加载时html中定义的元素值

.prop():

获取匹配元素集合中第一个元素的属性值。提供通过javascript/jquery修改的元素的更新值

如果代码是以这种方式编写的,Gary Hole的答案与解决问题非常相关

obj.prop("style","border:1px red solid;")

由于prop函数返回CSSStyleDeclaration对象,上述代码在某些浏览器中无法正常工作(在我的例子中,使用带有Chrome框架插件的IE8进行了测试)。

因此,将其更改为以下代码

obj.prop("style").cssText = "border:1px red solid;"

解决了问题。