2018.3.1更:javascript
有赞·微商城部门招前端啦,最近的前端hc有十多个,跪求大佬扔简历,我直接进行内推实时反馈进度,有兴趣的邮件 lvdada#youzan.com,或直接微信勾搭我 wsldd225 了解跟多html
有赞开源组件库·zanUI前端
原文:http://joji.me/en-us/blog/html-attribute-vs-dom-propertyjava
当咱们经过js处理DOM对象时很是容易将attribute(特性)和property(属性)混淆。document.getElementById('test').getAttribute('id')
,$('#test').attr('id'), document.getElementById('test').id
还有$('#test').prop('id')
三者都返回相同的id:“test”。这篇文章我将解释attribute和property的区别。jquery
<div id="test" class="button" custom-attr="1"></div>
复制代码
document.getElementById('test').attributes;
// return: [custom-attr="hello", class="button", id="test"]
复制代码
document.getElementById('test').getAttribute('custom-attr')
或者$('#test').attr('custom-attr')
老是返回字符串类型的"1"。document.getElementById('test').foo = 1; // 设置属性: foo 为 number类型: 1
document.getElementById('test').foo; // 获取属性值, return number: 1
$('#test').prop('foo'); // 使用jquery获取属性值, return number: 1
复制代码
$('#test').prop('foo', {
age: 23,
name: 'John'
}); // 使用jquery设置一个名为foo的对象
document.getElementById('test').foo.age; // return number类型: 23
document.getElementById('test').foo.name; // return string类型: "John"
复制代码
**译者注:**这里的property能够是任意类型指的是咱们为DOM对象自定义添加的属性,对于DOM对象的原始属性,相似name
属性,不管咱们设置什么类型的值,最后返回的都是字符类型。浏览器
另外,咱们获取HTML5定义的data属性时,获取的值也是字符串。<div data-id="33"></div>
,ele.dataset.id // string 33
bash
<div id="test" class="button" foo="1"></div>
复制代码
document.getElementById('test').id; // return string: "test"
document.getElementById('test').className; // return string: "button"
document.getElementById('test').foo; // return undefined 由于foo是一个自定义的attr特性
复制代码
注意:当咱们经过property属性进行设置或获取class时,咱们须要使用**"className"**,由于在js中class
是关键字。微信
**译者注:**第二点的意思是说当咱们在html中写非自定义的attribute特性时,DOM对象会自动映射对应的propertydom
<div id="test" class="button"></div>
复制代码
var div = document.getElementById('test');
div.className = 'red-input';
div.getAttribute('class'); // return string: "red-input"
div.setAttribute('class','green-input');
div.className; // return string: "green-input"
复制代码
<input id="search" value="foo" />
复制代码
var input = document.getElementById('search');
input.value = 'foo2';
input.getAttribute('value'); // return string: "foo"
复制代码
**译者注:**这条特性意味着咱们平时在写业务的时候多数状况下使用property是正确的。当用户input输入更改的时候,attribute-value值不会变化,即便js更改value,也不会使attribute变化。这也验证了第三点的。ui
在javascript中咱们推荐使用property属性由于这个属性相对attribute更快,更简便。尤为是有些类型本该是布尔类型的attribute特性。好比:"checked", "disabled", "selected"。浏览器会自动将这些值转变成布尔值传给property属性。
<input id="test" class="blue" type="radio" />
复制代码
好实践
// get id
document.getElementById('test').id;
// set class
document.getElementById('test').className = 'red';
// get and set radio control status
document.getElementById('test').checked; // boolean
document.getElementById('test').checked = true;
$('#test').prop('checked'); // boolean
$('#test').prop('checked', true);
复制代码
坏实践
// get id
document.getElementById('test').getAttribute('id');
// set class
document.getElementById('test').setAttribute('class', 'red');
document.getElementById('test').getAttribute('checked'); // 返回字符串类型 'checked'
复制代码
本文来自二口南洋,有什么须要讨论的欢迎找我。