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 相关文章推荐
document对象execCommand的command参数介绍
Aug 01 Javascript
用javascript实现无刷新更新数据的详细步骤 asp
Dec 26 Javascript
JavaScript 验证浏览器是否支持javascript的方法小结
May 17 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
javascript操作select元素实例分析
Mar 27 Javascript
Node.js事件驱动
Jun 18 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
基于JavaScript实现简单的随机抽奖小程序
Jan 05 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
js oncontextmenu事件使用详解
Mar 25 Javascript
浅谈Angular 中何时取消订阅
Nov 22 Javascript
node 解析图片二维码的内容代码实例
Sep 11 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
论建造顺序的重要性
2020/03/04 星际争霸
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Linux中Python 环境软件包安装步骤
2016/03/31 Python
基于Python log 的正确打开方式
2018/04/28 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
虚拟机下载python是否需要联网
2020/07/27 Python
会计应聘求职信范文
2013/12/17 职场文书
高级编程求职信模板
2014/02/16 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
春节慰问简报
2015/07/21 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
Nginx实现负载均衡的项目实践
2022/03/18 Servers
MySQL新手入门进阶语句汇总
2022/09/23 MySQL