症状:设置一个元素的innerHTML值时,如果提供的HTML代码包含JS脚本,这些脚本是无效的,或者是有效的在一些浏览器中,但它们在其他浏览器无效。

原因:不同的浏览器有不同的处理方法对innerHTML插入脚本。通过实践,总结出以下几方面:

IE,首先,脚本标签必须defer属性,接下来,在插入的时候,所有的节点必须在DOM树。

对于Firefox和Opera,在插入时间的innerHTML的节点不能在DOM树。

根据以上结论,innerHTML方法的一套共同给出:

复制代码代码如下所示:

*

*说明:跨浏览器设置innerHTML方法

*允许插入的HTML代码包含脚本和样式。

*参数:

*在EL的节点:DOM树,设置innerHTML

* htmlcode:插入HTML代码

*测试的浏览器:IE5 +,firefox1.5 +,opera8.5 +

* /

无功set_innerhtml =功能(EL,htmlcode)

{ var ua = navigator.useragent.tolowercase();

如果(ua.indexof('msie)或0 ua.indexof('opera)<0)

{ htmlcode = '即' + htmlcode;

htmlcode = htmlcode.replace(> / GI), / *)};

el.innerhtml = htmlcode;

el.removechild(EL。第一个孩子);

}

其他的

{ var el_next = el.nextsibling;

无功el_parent = el.parentnode;

el_parent.removechild(EL);

el.innerhtml = htmlcode;

如果(el_next)

el_parent.insertbefore(EL,el_next)

其他的

el_parent.appendchild(EL);

}

}



上面的代码也有一个问题:如果插入HTML代码包含document.write语句,整个页面就会被破坏。在这种情况下,你可以避免它重新定义document.write.the代码如下:

复制代码代码如下所示:

*

描述:定义document.write函数。

避免使用set_innerhtml,插入HTML代码包含document.write语句,使原有的页面被损坏。

* /

=(){ document.write函数

VaR的身体= document.getelementsbytagname('body){ 0 };

对于(var i = 0;i < arguments.length;i++){

参数=参数{ };

如果(typeof争论= = 'String'){

var el = body.appendchild(document.createelement('div '));

set_innerhtml(EL,论据)

}

}

}