在獲取比較值的時候會用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的模式,估計還是為了兼容之前的版本。