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 相关文章推荐
从JavaScript的函数重名看其初始化方式
Mar 08 Javascript
JavaScript入门教程(10) 认识其他对象
Jan 31 Javascript
js css样式操作代码(批量操作)
Oct 09 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
Function.prototype.apply()与Function.prototype.call()小结
Apr 27 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 Javascript
angular forEach方法遍历源码解读
Jan 25 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
Mar 06 Javascript
layer.alert自定义关闭回调事件的方法
Sep 27 Javascript
浅析vue-router实现原理及两种模式
Feb 11 Javascript
uniapp开发打包多端应用完整方法指南
Dec 24 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
极典R601SW收音机
2021/03/02 无线电
PHP中英混合字符串截取函数代码
2011/07/17 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
jQuery圆形统计图开发实例
2015/01/04 Javascript
浅谈js中的闭包
2015/03/16 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
简单了解python反射机制的一些知识
2019/07/13 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
内业资料员岗位职责
2014/01/04 职场文书
入党自我评价优缺点
2014/01/25 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
党员转正申请报告
2015/05/15 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python