innerHTML动态添加html代码和脚本兼容多个浏览器


Posted in Javascript onOctober 11, 2014

症状:给某个元素的 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)

}

}

}
Javascript 相关文章推荐
return false,对阻止事件默认动作的一些测试代码
Nov 17 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
Jquery zTree 树控件异步加载操作
Feb 25 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
jQuery Easyui 下拉树组件combotree
Dec 16 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
Jan 05 Javascript
详解Vue-基本标签和自定义控件
Mar 24 Javascript
js 用于检测类数组对象的函数方法
May 02 Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
用 js 写一个 js 解释器过程详解
Aug 02 Javascript
ie8模式下click无反应点击option无反应的解决方法
Oct 11 #Javascript
JS 获取鼠标左右键的键值方法
Oct 11 #Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 #Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 #Javascript
JavaScript中实现最高效的数组乱序方法
Oct 11 #Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 #Javascript
JavaScript定义变量和变量优先级问题探讨
Oct 11 #Javascript
You might like
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python显示生日是星期几的方法
2015/05/27 Python
Python线程详解
2015/06/24 Python
Python 通配符删除文件的实例
2018/04/24 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
python urllib和urllib3知识点总结
2021/02/08 Python
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
《值日生》教学反思
2014/02/17 职场文书
中式结婚主持词
2014/03/14 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
工作推荐信范文
2014/05/10 职场文书
企业宗旨标语
2014/06/10 职场文书
个人汇报材料范文
2014/12/30 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书