innerHTML動態添加html代碼和指令碼相容多個瀏覽器,innerhtmlhtml
癥狀:給某個元素的 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') < 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 函數.
避免在使用 set_innerHTML 時,插入的 HTML 程式碼中包含 document.write 語句,導致原頁面受到破壞。
*/
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)
}
}
}
js插入html代碼,innerHTML沒有效果
在最後加一個alert(document.getElementById("carnr").innerHTML)看看彈出的HTML代碼是否正確。
個人感覺可能是拼接的問題。有可能是沒有結束標籤什麼的。或者你用google瀏覽器調試也可以。看下容器內的代碼是否正確。
對於字串的串連可以這樣
var list = [];
list.push(“<table>”);
list.push(“<tr><td></td></tr>”);
list.push(“<tr><td></td></tr>”);
list.push(“<tr><td></td></tr>”);
list.push(“</table>”);
alert(list.join(""));
js動態添加、刪除html代碼
function AddOrDelModel(modelId){
var insertText = '<table tag=' + modelId + '><tr><td>' + modelId + '被選中</td></tr></table>', insertEl = document.getElementById("insert");
if(document.getElementById(modelId).checked){
insertEl.innerHTML = insertEl.innerHTML + insertText;
}else{
var tables = insertEl.getElementsByTagName("table");
for(var i = 0; i < tables.length; i++){
if(tables[i].tag = modelId){
insertEl.removeChild(tables[i]);
break;
}
}
}
}