jQuery attr vs道具?
现在,这不仅是另一个有什么区别的问题 ,我已经做了一些testing(http://jsfiddle.net/ZC3Lf/)修改<form action="/test/"></form>
的prop
和attr
。输出是:
1)道具修改testing
支柱:http://fiddle.jshell.net/test/1
:http://fiddle.jshell.net/test/1
Attr:http://fiddle.jshell.net/test/1
:http://fiddle.jshell.net/test/1
2)Attr修改testing
支柱:http://fiddle.jshell.net/test/1
:http://fiddle.jshell.net/test/1
Attr:/test/1
3)然后是修改testing
支柱:http://fiddle.jshell.net/test/11
:http://fiddle.jshell.net/test/11
Attr:http://fiddle.jshell.net/test/11
:http://fiddle.jshell.net/test/11
4)Prop然后Attr修改testing
支柱:http://fiddle.jshell.net/test/11
:http://fiddle.jshell.net/test/11
Attr:http://fiddle.jshell.net/test/11
:http://fiddle.jshell.net/test/11
就我所知,现在我对一些事情感到困惑:
Prop:通过JavaScript进行修改之后,它的当前状态值
Attr在页面加载的html中定义的值。
现在如果这是正确的,
- 为什么修改
prop
似乎使action
完全合格,反之为什么修改属性不是? - 为什么修改
prop
在1)
修改属性,那对我没有意义? - 为什么修改
attr
2)
修改属性,它们是否意味着这样链接?
testing代码
HTML
JavaScript的
var element = $('form'); var property = 'action'; /*You should not need to modify below this line */ var body = $('body'); var original = element.attr(property); body.append('<h1>Prop Modification test</h1>'); element.prop(property, element.prop(property) + 1); body.append('Prop: '+element.prop(property)+'<br />'); body.append('Attr: '+element.attr(property)+'<hr />'); //reset element.prop(property, original); element.attr(property, original); body.append('<h1>Attr Modification test</h1>'); element.attr(property, element.attr(property) + 1); body.append('Prop: '+element.prop(property)+'<br />'); body.append('Attr: '+element.attr(property)+'<hr />'); //reset element.prop(property, original); element.attr(property, original); body.append('<h1>Attr then Prop Modification test</h1>'); element.attr(property, element.attr(property) + 1); element.prop(property, element.prop(property) + 1); body.append('Prop: '+element.prop(property)+'<br />'); body.append('Attr: '+element.attr(property)+'<hr />'); //reset element.prop(property, original); element.attr(property, original); body.append('<h1>Prop then Attr Modification test</h1>'); element.prop(property, element.prop(property) + 1); element.attr(property, element.attr(property) + 1); body.append('Prop: '+element.prop(property)+'<br />'); body.append('Attr: '+element.attr(property)+'<hr />');
不幸的是你的链接没有工作:(
有一些洞察力, attr
是所有的属性。 prop
是属性。
在较老的jQuery版本(<1.6)中,我们只有attr
。 要获得DOM属性(如nodeName
, selectedIndex
或defaultValue
您必须执行以下操作:
var elem = $("#foo")[0]; if ( elem ) { index = elem.selectedIndex; }
这吸了,所以prop
添加:
index = $("#foo").prop("selectedIndex");
这很好,但令人讨厌的是这不是向后兼容的,如:
<input type="checkbox" checked>
没有checked
属性,但它有一个名为checked
的属性。
所以,在1.6的最终版本中, attr
也做了一些prop
以使事情没有中断。 有些人希望这是一个彻底的rest,但是我认为是正确的决定,因为事情并没有到处都破了!
关于:
Prop:通过JavaScript进行修改之后,它的当前状态值
Attr:在页面加载的html中定义的值。
这并非总是如此,因为属性实际上被改变了很多次,但是对于诸如checked这样的属性,没有属性可以改变,所以你需要使用prop。
参考文献:
.prop和.attr之间有明显的区别
考虑下面的HTML:
<form name="form" action="#"> <input type="text" name="action" value="myvalue" /> <input type="submit" /> </form> <pre id="return"> </pre>
和下面的JS使用jQuery:
$(document).ready(function(){ $("#return").append("$('form').prop('action') : " + $('form').prop('action') + '\r\n'); $("#return").append("$('form').attr('action') : " + $('form').attr('action') + '\r\n'); $("#return").append("document.form.action : " + document.form.action); });
$('form')。prop('action')将返回document.form.action node => HTMLInputElement
$('form')。attr('action')将返回action属性=>#
我已经试过了
console.log(element.prop(property)); console.log(element.attr(property));
并输出如下
http://fiddle.jshell.net/test/ /test/
这可能表明,只有在使用prop
读取 action
时,该action
才会正常化。
因为jquery 1.6.1+ attr()像1.6之前一样返回/更改属性。 因此你的testing没有多大意义。
注意回报值的微小变化。
例如
attr('checked'):在1.6之前,真/假是从1.6.1开始的。 “checked”/ undefined被返回。
attr('selected'):在返回1.6 true / false之前,因为返回1.6.1“selected”/ undefined
在这里可以find德国这个主题的详细的概述: