首頁 >web前端 >js教程 >innerHTML動態新增html程式碼和腳本相容多個瀏覽器_javascript技巧

innerHTML動態新增html程式碼和腳本相容多個瀏覽器_javascript技巧

WBOY
WBOY原創
2016-05-16 16:34:181150瀏覽

症狀:給某個元素的 innerHTML 設定值時,如果提供的 HTML 程式碼中包含js腳本,很多時候這些腳本無效,或者在某種瀏覽器上有效,但在其它瀏覽器上無效。

原因:不同瀏覽器對插入 innerHTML 中的腳本有不同的處理方法。經過實踐,歸納如下:

對於IE,首先, script 標籤必須帶 defer 屬性,其次,在插入時刻,innerHTML 的所屬節點必須在 DOM 樹中.

對於 Firefox 和Opera,在插入時刻,innerHTML 的所屬節點不可以在 DOM 樹中。

根據上述結論,給出通用的設定 innerHTML 方法:

複製程式碼 程式碼如下:

/*
* 說明:跨瀏覽器的設定 innerHTML 方法
* 允許插入的 HTML 程式碼中包含 script 和 style
* 參數:
* el: DOM 樹中的節點,設定它的 innerHTML
* htmlCode: 插入的 HTML 程式碼
* 經測試的瀏覽器:ie5 , firefox1.5 , opera8.5
*/
var set_innerHTML = function (el, htmlCode)
{var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('msie') >= 0 && ua.indexOf('opera') {htmlCode = '
for IE
' htmlCode;
htmlCode = htmlCode.replace(/<script>]*)>/gi,'<script$1 defer="true">');<br /> el.innerHTML = htmlCode;<br /> el.removeChild(el.firstChild);<br /> }<br /> else <br /> {var el_next = el.nextSibling;<br /> var el_parent = el.parentNode;<br /> el_parent.removeChild(el);<br /> el.innerHTML = htmlCode;<br /> if (el_next)<br /> el_parent.insertBefore(el, el_next)<br /> else<br /> el_parent.appendChild(el);<br /> }<br /> }<br /> </script>

上面的程式碼還有一個問題:如果插入的 HTML 程式碼包含 document.write 語句,那麼就會破壞整個頁面。對於這種情況,可以透過重新定義 document.write 來避免。程式碼如下:
複製程式碼 程式碼如下:

/*
說明:重定義 document.write 函數.
避免使用 set_innerHTML 時,插入的 HTML 程式碼包含 document.write 語句,導致原頁受到破壞。
*/
document.write = function(){
var body = document.getElementsByTagName('body')[0];
for (var i = 0; i argument = arguments[i];
if (typeof argument == 'string') {
var el = body.appendChild(document.createElement('div'));
set_innerHTML(el, argument)
}
}
}
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn