第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

怪異的IE - 2

標(biāo)簽:
前端工具


文章截图 - 更好的排版
源代码下载



问题描述
前两天遇到这样的需求,动态的向页面添加CSS样式,是内联的样式而不是外部CSS文件。
和往常一样,我写下了下面的代码:

    function addCSS(content) {        $("<style />").attr("type", "text/css").html(content).appendTo("head");    }    $(function() {        addCSS("body { background-color: #ccc; }");    });


轻松搞定,当我正为这样简洁的语法暗自高兴时,却发现原本在Firefox下好好的样式在IE居然不见了!
通过IE8的开发人员工具查看,的确没有在Head中发现我们通过JavaScript添加的样式。
并且页面还报JavaScript错误: 


解决办法
这么简单的代码没可能写错啊,并且Firefox下执行是好的。所以我推测应该是IE对style这个标签的处理和Firefox不一样。
再结合IE下的错误提示:意外的调用了方法或属性访问。
那就不调用创建style标签的方法,直接通过拼接字符串的方式来创建style标签,如下:

    function addCSS(content) {        $('<style type="text/css">' + content + '</style>').appendTo("head");    }    $(function() {        addCSS("body { background-color: #ccc; }");    });


问题居然解决了,现在IE和Firefox下都好了。

深入思考
虽然能很快的解决问题,但是反过来再想一下为什么会出现这个问题。
很快,我在网上找到了这一篇文章
原来IE对style标签的处理方式的确和其他的不同,IE需要设置style节点的styleSheet.cssText属性,
而Firefox对style标签的处理和普通的div没什么分别。
原文作者还提供了一个在IE和Firefox下通用的方法:

    var ss1 = document.createElement('style');    var def = 'body {color: red;}';    ss1.setAttribute("type", "text/css");    if (ss1.styleSheet) {   // IE        ss1.styleSheet.cssText = def;    } else {                // the world        var tt1 = document.createTextNode(def);        ss1.appendChild(tt1);    }    var hh1 = document.getElementsByTagName('head')[0];    hh1.appendChild(ss1);


现在的问题是为什么我们可以简单的通过:$('<style .. />').appendTo("head");就能把问题解决了?

类比Table
如果你以前遇到过在IE下不能设置table的innerHTML的话,这是类似的一个问题,如下所示:

    // 这段代码在Firefox正确运行,在IE下报错    function createTable() {        var table = document.createElement("table");        table.innerHTML = "<tr><td>Content</td></tr>";        document.body.appendChild(table);    }    $(function() {        createTable();    });

这段代码在Firefox下正确运行,在IE下同样会报如下错误: 


因为在IE下,table的innerHTML是一个只读属性,所以不能通过为innerHTML赋值的方式创建table,
但是我们可以创建整个table,并嵌入在一个div中来在IE下创建一个表格,如下所示:

    // 这段代码在Firefox和IE都能正确运行    function createTable2() {        var div = document.createElement("div");        div.innerHTML = "<table><tr><td>Content2</td></tr></table>";        document.body.appendChild(div);    }    $(function() {        createTable2();    });


小结
问题到这里已经很明白了,我们的解决方法其实等价于不使用jQuery的如下代码:

    function addCSS2(content) {        var div = document.createElement("div");        div.innerHTML = '<style type="text/css">' + content + '</style>';        var head = document.getElementsByTagName("head")[0];        head.appendChild(div);        // 删除style外面的div标签        head.replaceChild(div.getElementsByTagName("style")[0], div);    }    $(function() {        addCSS2("body { background-color: #ccc; }");    });


大功告成?等等,怎么IE下还报错!!! 


经过一番痛苦的尝试,终于通过下面一个小技巧(仅仅在innerHTML前面添加一个空格&nbsp;)来解决这个问题,

    function addCSS2(content) {        var div = document.createElement("div");        div.innerHTML = '&nbsp;<style type="text/css">' + content + '</style>';        var head = document.getElementsByTagName("head")[0];        head.appendChild(div);        // 删除style外面的div标签        head.replaceChild(div.getElementsByTagName("style")[0], div);    }    $(function() {        addCSS2("body { background-color: #ccc; }");    });


至于为什么会这样,或许只有IE的开发人员才能回答这个问题。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消