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 文件大小判断的实现代码
Apr 07 Javascript
基于jquery的横向滚动条(滑动条)
Feb 24 Javascript
jquery封装的对话框简单实现
Jul 21 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
Jan 20 Javascript
js实现年月日表单三级联动
Apr 17 Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 Javascript
bootstrapvalidator之API学习教程
Jun 29 Javascript
easyui简介_动力节点Java学院整理
Jul 14 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
Sep 06 jQuery
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 jQuery
vue中更改数组中属性,在页面中不生效的解决方法
Oct 30 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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php 分页函数multi() discuz
2009/06/21 PHP
php动态变量定义及使用
2015/06/10 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
python 读取DICOM头文件的实例
2018/05/07 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
django2.0扩展用户字段示例
2019/02/13 Python
对Python _取log的几种方式小结
2019/07/25 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
留学自荐信写作方法
2014/01/27 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
本科毕业生自荐信
2014/06/02 职场文书
地道战观后感2000字
2015/06/04 职场文书
解析目标检测之IoU
2021/06/26 Python
JavaScript获取URL参数的方法分享
2022/04/07 Javascript