今天在學習中遇到了在ie中設置class屬性值的bug,現寫出來與你們分享,一塊兒共勉,若有錯漏望不吝指正。html
如:瀏覽器
|
elm.setAttribute('class', 'className');
|
在IE6/7中樣式「className」並無起做用,雖然使用elm.getAttribute('class')是能夠獲取到「className」。dom
後來上網查了一些資料,發現了在ie中其實還有一部分屬性也會有這樣的問題,像for屬性ide
|
<label>姓名:</label>
<input type="checkbox" id="name"/>
<script>
var lab = document.getElementsByTagName('label')[0];
lab.setAttribute('for', 'name');
</script>
|
理論上若是lab設置了for屬性,點擊label時會自動將對應的checkbox選中。但在IE6/7點擊並無選中相應的checkbox。post
並且相似的狀況還發生在 cellspacing/cellpadding 等屬性上,現列出來,你們能夠認一下,之後作的時候能夠注意一下:學習
classspa
forhtm
cellspacingblog
cellpadding接口
tabindex
readonly
maxlength
rowspan
colspan
usemap
frameborder
contenteditable
因此,當在寫一個通用的跨瀏覽器的設置元素屬性的接口方法時,咱們就須要考慮注意以上屬性在IE6/7中的特殊性。
網上就有位朋友寫了以下方法以解決上面的問題:
|
dom = (function() {
var fixAttr = {
tabindex: 'tabIndex',
readonly: 'readOnly',
'for': 'htmlFor',
'class': 'className',
maxlength: 'maxLength',
cellspacing: 'cellSpacing',
cellpadding: 'cellPadding',
rowspan: 'rowSpan',
colspan: 'colSpan',
usemap: 'useMap',
frameborder: 'frameBorder',
contenteditable: 'contentEditable'
},
div = document.createElement( 'div' );
div.setAttribute('class', 't');
var supportSetAttr = div.className === 't';
return {
setAttr : function(el, name, val) {
el.setAttribute(supportSetAttr ? name : (fixAttr[name] || name), val);
}
getAttr : function(el, name) {
return el.getAttribute(supportSetAttr ? name :(fixAttr[name] || name));
}
}
})();
|
首先,標準瀏覽器直接使用原始屬性名;其次,IE6/7非以上列舉的屬性仍然用原始屬性名;最後這些特殊屬性(與JS關鍵字同名如for,class)使用fixAttr。
到了這裏,咱們就不用考慮className/htmlFor了,直接使用class/for便可。
|
dom.setAttr(el, 'class', 'red');
dom.getAttr(el, 'class');
dom.setAttr(el, 'for', 'userName');
dom.getAttr(el, 'for');
|