在获取比较值的时候会用in来判断是否可以用[x]方式,其实是判断该属性是属于attribute还是property。 那attribute和property到底是什么呢,有什么区别呢?这个或许很多人都没留意,或许认为是同一个东西。 要明确attribute和property是不同的东西就要先知道它们分别是什么,这个很难说得清,举些例子就明白了。 这里我们先以ff为标准,后面再说ie的区别。以div为例,查查网页制作完全手册,会找到它有以下属性: ALIGN align CLASS className ID id TITLE title ... ... 其中第一列就是attribute,第二列就是property。 attribute是dom元素在文档中作为html标签拥有的属性,property就是dom元素在js中作为对象拥有的属性。 例如在html中dom作为页面元素应该直接用class属性,对应在js中作为dom对象就必须用className属性。 由于attribute是不分大小写的,这使得大部分的attribute和property看起来会一样,使人误以为同一个东西(当然ie的责任也很大)。 还不相信的话可以用ff看看下面的例子:
<div id="t" tt="1">test </div> <script> var o = document.getElementById('t'); o["tt"]="2"; document.writeln(o.getAttribute("tt")); document.writeln(o["tt"]); </script>
<div id="t" class="a">test </div> <script> var o = document.getElementById('t'); o.setAttribute("class","b"); alert(o.outerHTML); </script>
这样修改的样式是无效的,按照ie的规矩要使用className,但问题是从outerHTML中居然看到div标签中有两个class属性。 之前我一直都不知如何理解ie这个现象,不过这在ie8中已经得到了修正。 在ie8中已经把attribute和property区分开了(详细看Attribute Differences in Internet Explorer 8)。 例如getAttribute("innerHTML")返回的是null,说明innerHTML不再是attribute;setAttribute("class",x)修改的是attribute,不再是给dom元素添加一个莫名其妙的class属性,貌似getAttribute也没有了第二个参数(getAttribute的第二个参数可以看这里)。 不过ie8依然使用添加新属性会同时是attribute和property的模式,估计还是为了兼容之前的版本。