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 相关文章推荐
直接生成打开窗口代码,不必下载
May 14 Javascript
JS无限树状列表实现代码
Jan 11 Javascript
jQuery中创建实例与原型继承揭秘
Dec 21 Javascript
js点击选择文本的方法
Feb 09 Javascript
javascript制作2048游戏
Mar 30 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
Apr 06 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
Dec 17 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 Javascript
通过扫小程序码实现网站登陆功能
Aug 22 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 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/10/09 PHP
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
js切换光标示例代码
2013/10/10 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python实现井字棋游戏
2020/03/30 Python
Python编码类型转换方法详解
2016/07/01 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
澳大利亚网上书店:QBD
2021/01/09 全球购物
Final类有什么特点
2012/04/25 面试题
导游个人求职信
2014/04/25 职场文书
租房安全协议书
2014/08/20 职场文书
整改报告格式
2014/11/06 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
求职自荐信怎么写
2015/03/04 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android