DOM中的Attribute与Property的区别
attribute与property这两个值总是给人以相同的感觉,其实他们之间也是有很大的不同的。 注:IE8-中两个值是一样的。
1.attribute
在原生JS中,提供了getAttribute/setAttribute等原生方法来获取或改变这些值。在节点中,也会细分属性节点,用attribute属性来获取。
<div id="one" name="two" data="three">1111</div>
var oDiv = document.getElementById('one');
console.log(oDiv.getAttribute('id')); // one
console.log(oDiv.getAttribute('name')); // two
console.log(oDiv.attributes); // NamedNodeMap {....} 仍可用 oDiv.attributes.属性获取
2.property
每个DOM节点可以看成是一个对象,我们要取其值时,只需要像对象取其属性一样操作就行了。
<div id="one" name="two" data="three">1111</div>
var oDiv = document.getElementById('one');
console.log(oDiv.id); // one
console.log(oDiv.name); // undefined
我们可以直接取到id却取不到name,很显然,name不是一个property,默认的属性一般包括,id、src、href、className、dir、title、lang等。
3.自定义值下的attr和prop是不相等的
<div id="one" name="two" hehe="three" ok="true">1111</div>
var oDiv = document.getElementById('one');
console.log(oDiv.hehe); // undefined
console.log(oDiv.getAttribute('hehe')); // three
oDiv.ok = 'ok';
console.log(oDiv.ok); // ok
console.log(oDiv.getAttribute('ok')); // null
可以看出对于自定义的属性,两种值下的结果是不一样的。写在html中的值,是一直可以用attribute来获取的,而直接用属性获取,则只能是用JS添加的。
4.非自定义值
<input id="txt" type="text" />
var oTxt = document.getElementById('txt');
console.log(oTxt.value); // ""
console.log(oTxt.getAttribute('value')); // null
<input id="txt" type="text" value="123" />
var oTxt = document.getElementById('txt');
console.log(oTxt.value); // '123'
console.log(oTxt.getAttribute('value')); // '123'
对于DOM元素,未初始化的变量值的property与attribute是不一样的。对于前一个input框,我们继续操作,
var oTxt = document.getElementById('txt');
oTxt.value = 456;
console.log(oTxt.value); // 456
console.log(oTxt.getAttribute('value')); // 123
var oTxt = document.getElementById('txt');
oTxt.setAttribute('value', 456);
console.log(oTxt.value); // 456
console.log(oTxt.getAttribute('value')); // 456
两种赋值方式都可以将输入框中的值改成456,但是影响是不同的。因为attribute的变化会反应到property上去,而property的改变不会影响attribute。 当然,同步不是完完全全的同步,当获取src或是href时,
<a id="adv" href="./1.html"></a>
var oA = document.getElementById('adv');
console.log(oA.href); // file:///D:/xampp/htdocs/project/1.html
console.log(oA.getAttribute('href')); // ./1.html
attribute是直接取得html中的相对路径,而property则是绝对路径。 熟悉了这两个值的不同,何时选取哪个值就会变得很容易了。