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 相关文章推荐
JS之小练习代码
Oct 12 Javascript
JavaScript 对Cookie 操作的封装小结
Dec 31 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
Jun 19 Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
Dec 28 Javascript
Bootstrap进度条实现代码解析
Mar 07 Javascript
es6学习笔记之Async函数基本教程
May 11 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
Nov 24 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 Javascript
微信小程序自定义toast弹窗效果的实现代码
Nov 15 Javascript
JavaScript实现简单的计算器
Jan 16 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通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python的面向对象思想分析
2015/01/14 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
pandas的排序和排名的具体使用
2019/07/31 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
社区党建工作汇报材料
2014/08/14 职场文书
会计学习心得体会
2014/09/09 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
街道务虚会发言材料
2014/10/20 职场文书
考试作弊检讨书
2015/01/27 职场文书
女儿满月酒致辞
2015/07/29 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis