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中简单的实现像C#中using功能(有源码下载)
Jan 09 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
Nov 22 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
Oct 17 Javascript
JS弹出窗口的运用与技巧大全
Nov 01 Javascript
利用JQuery阻止事件冒泡
Dec 01 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
Dec 22 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
Feb 14 Javascript
JS获取子、父、兄节点方法小结
Aug 14 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
今天,小程序正式支持 SVG
Apr 20 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
session 的生命周期是多长
2006/10/09 PHP
php通用防注入程序 推荐
2011/02/26 PHP
php正则表达式(regar expression)
2011/09/10 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
python使用matplotlib库生成随机漫步图
2018/08/27 Python
浅谈python3中input输入的使用
2019/08/02 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
管理站站长岗位职责
2013/11/27 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
教师工作表现自我评价
2015/03/05 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
python数字转对应中文的方法总结
2021/08/02 Python