今天在學(xué)習(xí)中遇到了在ie中設(shè)置class屬性值的bug,現(xiàn)寫出來與大家分享,一起共勉,如有錯(cuò)漏望不吝指正。
如:
elm.setAttribute('class', 'className');
在IE6/7中樣式“className”并沒有起作用,雖然使用elm.getAttribute('class')是可以獲取到“className”。
后來上網(wǎng)查了一些資料,發(fā)現(xiàn)了在ie中其實(shí)還有一部分屬性也會(huì)有這樣的問題,像for屬性
<label>姓名:</label>
<input type="checkbox" id="name"/>
<script>
??? var lab = document.getElementsByTagName('label')[0];
??? lab.setAttribute('for', 'name');
</script>
理論上如果lab設(shè)置了for屬性,點(diǎn)擊label時(shí)會(huì)自動(dòng)將對(duì)應(yīng)的checkbox選中。但在IE6/7點(diǎn)擊并沒有選中相應(yīng)的checkbox。
而且類似的情況還發(fā)生在 cellspacing/cellpadding 等屬性上,現(xiàn)列出來,大家可以認(rèn)一下,以后做的時(shí)候可以注意一下:
class
for
cellspacing
cellpadding
tabindex
readonly
maxlength
rowspan
colspan
usemap
frameborder
contenteditable
所以,當(dāng)在寫一個(gè)通用的跨瀏覽器的設(shè)置元素屬性的接口方法時(shí),我們就需要考慮注意以上屬性在IE6/7中的特殊性。
網(wǎng)上就有位朋友寫了如下方法以解決上面的問題:
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));??????
??????? }
??? }
})();
首先,標(biāo)準(zhǔn)瀏覽器直接使用原始屬性名;其次,IE6/7非以上列舉的屬性仍然用原始屬性名;最后這些特殊屬性(與JS關(guān)鍵字同名如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');
如:
elm.setAttribute('class', 'className');
在IE6/7中樣式“className”并沒有起作用,雖然使用elm.getAttribute('class')是可以獲取到“className”。
后來上網(wǎng)查了一些資料,發(fā)現(xiàn)了在ie中其實(shí)還有一部分屬性也會(huì)有這樣的問題,像for屬性
<label>姓名:</label>
<input type="checkbox" id="name"/>
<script>
??? var lab = document.getElementsByTagName('label')[0];
??? lab.setAttribute('for', 'name');
</script>
理論上如果lab設(shè)置了for屬性,點(diǎn)擊label時(shí)會(huì)自動(dòng)將對(duì)應(yīng)的checkbox選中。但在IE6/7點(diǎn)擊并沒有選中相應(yīng)的checkbox。
而且類似的情況還發(fā)生在 cellspacing/cellpadding 等屬性上,現(xiàn)列出來,大家可以認(rèn)一下,以后做的時(shí)候可以注意一下:
class
for
cellspacing
cellpadding
tabindex
readonly
maxlength
rowspan
colspan
usemap
frameborder
contenteditable
所以,當(dāng)在寫一個(gè)通用的跨瀏覽器的設(shè)置元素屬性的接口方法時(shí),我們就需要考慮注意以上屬性在IE6/7中的特殊性。
網(wǎng)上就有位朋友寫了如下方法以解決上面的問題:
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

??????? }
??? }
})();
首先,標(biāo)準(zhǔn)瀏覽器直接使用原始屬性名;其次,IE6/7非以上列舉的屬性仍然用原始屬性名;最后這些特殊屬性(與JS關(guān)鍵字同名如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');
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
