以下attribute均翻译为特性, property均翻译成属性, 后文会详细说明原因.
废话不多数, 先来看个JavaScript操作特性和属性的例子:
var btn = document.getElementById("btn"); btn.className = "btn"; //属性 btn.getAttribute("class"); //特性
以上两个语句都是在操作btn元素的class, 前者是属性. 后者是特性.
说到属性, 而且是点调用, 有没有想到JavaScript里的对象调用属性?
我们来看两个类比:
var obj = { name: "TinyColder", age: 22 }; alert(obj.name)//TinyColder
以上代码用点调用法, 调用了obj对象的name属性. 这就跟btn对象用点调用法调用className属性一样. 都是对象在调用自己所拥有的属性.
唯一的区别只是btn对象的属性是自动生成的而已
var btn = document.getElementById("btn");//从HTML获取元素节点对象. btn.getAttribute("class"); //从HTML获取特性
以上两个语句, 都是通过DOM API获取HTML的对象或者特性. 操作的都是HTML的东西, 而上一个属性操作的, 却是JavaScript的东西.
所以我们可以总结出这么一个不那么准确的结论:
1. 属性是JavaScript的东西
2. 特性是HTML的东西
如果只说写到这里, 那这篇文章未必太水. 接下来才是文章真正的开始. 就让我们再进一步, 彻底揭开特性和属性之间的区别, 弄懂我们是为什么被特性和属性绕晕的.
我们知道, HTML中的每个元素, 都会映射到JavaScript中的一个DOM对象. 既然是个对象, 那么就肯定有其属性和方法.
而DOM对象生来就具有className, style等属性和setAttribute等方法. 而这些属性是怎么来的呢? 正好就是从HTML元素那里映射过来的.
这个时候, 歧义就出来啦, HTML有特性, JavaScript有属性, 关键是一个DOM对象的特性和属性名字基本都是一样的. 关键是无论属性和特性, 还是attribute和property.都是近义词.
这就让人在很混乱. 但是也有例外.
举三个典型的例子: id, class, disabled
id在JavaScript中是id, 一模一样
class在JavaScript中是className, 名字不一样
disabled在JavaScript中是disabled, 但是值却不一样.
在HTML中, disabled的值写的什么就是什么, 但是对于JavaScript来说, 这个属性的值是个boolean类型值, 只有true和false之分.
<input type="text" class="test-class" id="test-id" disabled="disabled"> <script type="text/javascript"> var btn = document.getElementById("test-id"); alert(btn.disabled);//true alert(btn.getAttribute("disabled"));//disabled </script>
吃个饭回来再写...