innerHTML動態(tài)添加html代碼和腳本兼容多個瀏覽器
癥狀:給某個元素的 innerHTML 設(shè)置值時(shí),如果提供的 HTML 代碼中包含js腳本,很多時(shí)候這些腳本無效,或者在某種瀏覽器上有效,但在其它瀏覽器上無效。
原因:不同瀏覽器對插入 innerHTML 中的腳本有不同的處理方法。經(jīng)過實(shí)踐,歸納如下:
對于IE,首先, script 標(biāo)簽必須帶 defer 屬性,其次,在插入時(shí)刻,innerHTML 的所屬節(jié)點(diǎn)必須在 DOM 樹中.
對于 Firefox 和Opera,在插入時(shí)刻,innerHTML 的所屬節(jié)點(diǎn)不可以在 DOM 樹中。
根據(jù)上面結(jié)論,給出通用的設(shè)置 innerHTML 方法:
/*
* 描述:跨瀏覽器的設(shè)置 innerHTML 方法
* 允許插入的 HTML 代碼中包含 script 和 style
* 參數(shù):
* el: DOM 樹中的節(jié)點(diǎn),設(shè)置它的 innerHTML
* htmlCode: 插入的 HTML 代碼
* 經(jīng)測試的瀏覽器:ie5+, firefox1.5+, opera8.5+
*/
var set_innerHTML = function (el, htmlCode)
{var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('msie') >= 0 && ua.indexOf('opera') < 0)
{htmlCode = '<div style="display:none">for IE</div>' + htmlCode;
htmlCode = htmlCode.replace(/<script([^>]*)>/gi,'<script$1 defer="true">');
el.innerHTML = htmlCode;
el.removeChild(el.firstChild);
}
else
{var el_next = el.nextSibling;
var el_parent = el.parentNode;
el_parent.removeChild(el);
el.innerHTML = htmlCode;
if (el_next)
el_parent.insertBefore(el, el_next)
else
el_parent.appendChild(el);
}
}
上面的代碼還有一個問題:如果插入的 HTML 代碼中包含 document.write 語句,那么就會破壞整個頁面。對于這種情況,可以通過重新定義 document.write 來避免。代碼如下:
/*
描述:重定義 document.write 函數(shù).
避免在使用 set_innerHTML 時(shí),插入的 HTML 代碼中包含 document.write 語句,導(dǎo)致原頁面受到破壞。
*/
document.write = function(){
var body = document.getElementsByTagName('body')[0];
for (var i = 0; i < arguments.length; i++) {
argument = arguments[i];
if (typeof argument == 'string') {
var el = body.appendChild(document.createElement('div'));
set_innerHTML(el, argument)
}
}
}
- javascript innerHTML、outerHTML、innerText、outerText的區(qū)別
- innerhtml用法 innertext用法 以及innerHTML與innertext的區(qū)別
- IE6-IE9不支持table.innerHTML的解決方法分享
- innerHTML與jquery里的html()區(qū)別介紹
- 放棄用你的InnerHTML來輸出HTML吧 jQuery Tmpl不詳細(xì)講解
- js innerHTML 改變div內(nèi)容的方法
- 調(diào)用innerHTML之后onclick失效問題的解決方法
- IE6/IE7/IE8/IE9中tbody的innerHTML不能賦值的完美解決方案
- js使用for循環(huán)與innerHTML獲取選中tr下td值
- innerHTML中標(biāo)簽可以換行的方法匯總
相關(guān)文章
uni-app調(diào)取接口的3種方式以及封裝uni.request()詳解
我們在實(shí)際工作中要將數(shù)據(jù)傳輸?shù)椒?wù)器端,從服務(wù)器端獲取信息,都是通過接口的形式,下面這篇文章主要給大家介紹了關(guān)于uni-app調(diào)取接口的3種方式以及封裝uni.request()的相關(guān)資料,需要的朋友可以參考下2022-08-08
Javascript實(shí)現(xiàn)簡易導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Javascript實(shí)現(xiàn)簡易導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
js獲取系統(tǒng)的根路徑實(shí)現(xiàn)介紹
js如何獲取系統(tǒng)的根路徑,在本文給出了詳細(xì)的方法,感興趣的朋友可以參考下,希望對大家有所幫助2013-09-09
javascript創(chuàng)建含數(shù)字字母的隨機(jī)字符串方法總結(jié)
如果想創(chuàng)建一個含有數(shù)字、字母(大小寫)或者符號的字符串,比如從[a-zA-Z0-9]集合中中創(chuàng)建一個隨機(jī)的字符串,長度為5.有沒有什么比較好的代碼呢?本文提供了幾種方法,包括自動改變字符集合。一起來學(xué)習(xí)下。2016-08-08
JS?中的URLSearchParams?對象操作(以對象的形式上傳參數(shù)到url)
這篇文章主要介紹了JS中URLSearchParams的基本用法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12

