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 相关文章推荐
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
Oct 29 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
javascript中的window.location.search方法简介
Sep 02 Javascript
jquery+json实现数据列表分页示例代码
Nov 15 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
Jun 12 Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 Javascript
layui动态表头的实现代码
Aug 22 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
Nov 05 Javascript
用javascript实现倒计时效果
Feb 09 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
第七节--类的静态成员
2006/11/16 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
php 代码优化之经典示例
2011/03/24 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue观察模式浅析
2018/09/25 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
WxPython建立批量录入框窗口
2019/02/27 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
办公室文员自荐书
2014/02/03 职场文书
医学专业自荐信
2014/06/14 职场文书
西岭雪山导游词
2015/02/06 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
golang内置函数len的小技巧
2021/07/25 Golang
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis