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 相关文章推荐
网页编辑器ckeditor和ckfinder配置步骤分享
May 24 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
JavaScript基础知识学习笔记
Dec 02 Javascript
jQuery实现DIV层收缩展开的方法
Feb 27 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
JavaScript——DOM操作——Window.document对象详解
Jul 14 Javascript
canvas基础绘制-绚丽倒计时的实例
Sep 17 Javascript
浅谈node.js 命令行工具(cli)
May 10 Javascript
vue构建动态表单的方法示例
Sep 22 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
Jun 25 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代码简化
2010/02/08 PHP
php 生成文字png图片的代码
2011/04/17 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
js简易版购物车功能
2017/06/17 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
法学毕业生自我鉴定
2013/11/08 职场文书
春节请假条
2014/04/11 职场文书
工会换届选举方案
2014/05/21 职场文书
大学同学会活动方案
2014/08/20 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
教师工作总结范文2014
2014/11/10 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS