js中 aaa.style 和 aaa.getAttribute(style) 等價嗎,有無區別?
js中 aaa.style 和 aaa.getAttribute("style") 等價嗎,有沒有什麼區別?
我自己在各種瀏覽器(IE6到chrome)測試的結果是一樣,沒發現什麼區別是完全一樣嗎?============================
我知道大概區別了,下面第二句在高級瀏覽器下面查不到信息不過我想問的是,為什麼在IE6/7下第二句也可以成功執行???是否說在ie6/7下aaa.style和aaa.getAttribute("style")等價???alert(aaa.style.height);alert(aaa.getAttribute("style").height);
有區別
首先區分property和attribute,兩個翻譯成中文都可以作為屬性,但是在實際上是有區別的。
在html標籤里的屬性稱為attribute
例如:&alaki&這個dom element有3個attribute:href、data-tips、data-original_title
而property是那些它被創建的時候就有的屬性,例如attributes, autofocus, className, clientHeight。
特殊的是,假如&alaki&對於這個dom element來說,class不僅是attribute,同時它也是property,但是在dom.element中,只不過它叫className,這兩個是綁定的。簡單來說,一些特殊的attribute將會轉換為property,腳踏兩條船,同樣的style也是個腳踏兩條船的傢伙。
假如是內聯樣式,通過getAttribute("style")是可以獲得的,但只能獲取到內聯樣式部分屬性,通過外部樣式表或者內嵌樣式都是無法獲得的,返回值是字元串。
假如不是內聯,那麼getAttribute("style")返回null或者空字元串,返回哪一個取決於這個瀏覽器的實現 Element.getAttribute()。
上面兩種情況,dom.style都將獲得完整樣式屬性,返回值為對象CSSStyleDeclaration
最後一個關於ie6和ie7的問題,
如圖
裡面有一句話 :In IE5-7, accessing the style attribute gives an objectDOM Core在ie5-7裡面,getAttribute()的實現是跟dom.style一樣的效果的路過
這是個老問題現在應該早就不提了吧懶的再寫貼點兒老圖吧
由於寫的時間很早,細節上可能有變化
不過大致情況如此理解下就好了@alaki 已經說得很好了,我補充下。
elem.style 和 elem.getAttribute("style") 的關係我在這個回答里提到過一點,可以參考一下:webkit內核的瀏覽器為什麼removeAttribute("style")會失效? - 顧軼靈的回答 (裡面有些鏈接好像失效了)
總的來說,style 的內容屬性你改成啥就會保留你改後的樣子,但是 IDL 屬性讀時會根據新的內容屬性中對應的 CSS 屬性來更新,寫 IDL 屬性時還會重新序列化內容屬性以和 IDL 屬性保持同步。
舉個例子:HTML:&&
JavaScript:
console.log(x.getAttribute("style")); // "color: red; aaa: bbb;"
console.log(x.style.cssText); // "color: red;"
console.log(x.style.color); // "red"
x.style.color = "blue";
console.log(x.getAttribute("style")); // "color: blue;"
Are you kidding?
怎麼可能一樣,一個是CSSStyleDeclaration對象,一個是字元串。
謝邀。
不等價。碰巧等價也只是因為那是預置固有屬性。class(Name)開始就有兼容問題。自定義屬性完全行不通。比較可靠的是title這種。style我都懷疑是不是能作為對象用。
實踐建議是原生屬性一律.xxx,自定義屬性一律.getAttribute。後者考慮到兼容性,包括了data-*。
補充:實測.getAttribute("style")是字元串。ie7-不支持.setAttribue("style","")IE6/7下 `elem.getAttribute("style")`和`elem.style`返回的都是`CSSStyleDeclaration`對象。這是個BUG,在IE8之後已經被修復了。 `elem.getAttribute("style")`返回的是元素的style屬性上css文本(如果有點話,沒有返回null),而`elem.style`返回`CSSStyleDeclaration`。
aaa.getAttribute("style")獲取的是aaa的內聯樣式字元串
在Secret Of The JavaScript Ninja 中有詳細講解這兩個的區別。
兩者儲存的數據結構不一樣。還有Attribute就是dom節點自帶的屬性,而Property是這個DOM元素作為對象。
推薦閱讀:
※html5推出queryselectall之後,jQuery的作用是否減小了?
※babel@6.2.0預編譯的ES6代碼無法在IE8上愉快的運行,各位前輩有辦法嗎?
※到 2013 年底,WebGL 能發展到什麼程度?
※macOS Sierra 官網的視覺差動畫是如何實現的?
※為什麼把 Script 標籤放在 body 結束標籤之後 html 結束標籤之前?
TAG:前端開發 | JavaScript | HTML5 | Nodejs |