`
hcx_2008
  • 浏览: 122169 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

跨浏览器的设置innerHTML方法

    博客分类:
  • J2EE
阅读更多
From:http://www.ajaxwing.com/index.php?c=DOM
Author:kenxu

很多人都可能遇到过这种情况:设置 innerHTML 的时候,插入的 HTML 代码中包含脚本,但这些脚本却不生效,或者在 IE 上生效在其它浏览器上就不生效。原因很简单:不同浏览器对插入 innerHTML 中的脚本有不同的处理方法。经过实践,归纳如下:
对于IE,首先 script 标签必须带 defer 属性,其次在插入时刻,innerHTML 的所属节点必须在 DOM 树中;对于 Firefox 和 Opera,在插入时刻,innerHTML 的所属节点不可以在 DOM 树中。

根据上面结论,给出通用的设置 innerHTML 方法:

/*
* 描述:跨浏览器的设置 innerHTML 方法
* 允许插入的 HTML 代码中包含 script 和 style
* 作者:kenxu <ken@ajaxwing.com>
* 日期:2006-03-23
* 参数:
* el: 合法的 DOM 树中的节点
* htmlCode: 合法的 HTML 代码
* 经测试的浏览器:ie5+, firefox1.5+, opera8.5+
*/
var setInnerHTML = 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);
}
}
}

还有某些情况,我们事先不清楚要插入到 innerHTML 的 HTML 代码包含什么,如果包含 document.write 语句,那么就会破坏整个页面。对于这种情况,可以通过重新定义 document.write 来避免。代码如下:
/*
* 描述:通过重定义 document.write 函数,避免在使用 setInnerHTML 时,
* 插入的 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'));
setInnerHTML(el, argument)
}
}
}

在这篇文章编写之前,已经有一个比较完善的解决方法《让插入到 innerHTML 中的 script 跑起来》。比较起来,《让》给出的方法考虑得更细致,但处理起来比较繁琐,效率不高。而这里给出的方法则更简单,并且充分利用了浏览器的特性。
分享到:
评论

相关推荐

    跨浏览器开发经验总结

    ### 跨浏览器开发经验总结 #### 一、HTML标记 在进行Web开发的过程中,确保页面在不同的浏览器中表现一致是一项挑战。以下是一些关键的HTML标记使用技巧: 1. **为页面添加DOCTYPE** - **定义DOCTYP的重要性**...

    js跨浏览器是正对目前各浏览器标准不同

    不同的浏览器在实现DOM API时可能存在细微差异,例如`innerHTML`属性或`addEventListener`方法。统一使用DOM Level 2和3标准可以减少这种问题。 4. **事件处理**: 事件处理在不同浏览器间也存在差异,如事件冒泡...

    innerHTML动态添加html代码和脚本兼容多个浏览器

    症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在某种浏览器上有效,但在其它浏览器上无效。 原因:不同浏览器对插入 innerHTML ...* 描述:跨浏览器的设置 in

    编写跨浏览器的javascript代码必备[js多浏览器兼容写法]

    跨浏览器兼容写法建议使用`document.querySelectorAll`或`document.querySelectorAll`方法,因为这两个方法在现代浏览器中得到了良好支持。 在IE 6及更早版本中,`obj.getAttribute`可以用来访问元素的固有属性和...

    js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法

    同时,也是对编写跨浏览器代码的一种提醒,即应当考虑不同浏览器和不同版本之间的兼容性问题,尤其是在处理DOM操作和使用第三方库时。对于开发者而言,始终关注最新的浏览器动态,理解各个浏览器的DOM模型差异,并在...

    给before和after伪元素设置js效果的方法.docx

    因此,我们需要使用兼容写法来实现跨浏览器支持。 方法二:添加自带伪类的类名 添加自带伪类的类名是一种简单的方法。我们可以在CSS中定义一个类,然后使用JavaScript将该类添加到需要设置js效果的元素上。例如,...

    innerHtml用法精解

    #### 四、跨浏览器的设置InnerHTML方法 在不同的浏览器中,`innerHTML`的处理方式可能会有所不同。特别是在涉及脚本标签时,需要特别注意: - **IE浏览器**:要求脚本标签带有`defer`属性,并且元素必须存在于DOM...

    IE6/7/8中使用innerHTML清空元素,其子元素也被清空

    这个现象在其他现代浏览器中并不常见,因此了解这一问题对于解决跨浏览器兼容性问题至关重要。 `innerHTML`是JavaScript中一个非常实用的属性,用于获取或设置HTML元素内部的HTML内容。当你为一个元素设置`...

    ajax实例,兼容各个主流浏览器

    3. **设置请求头**:如果需要发送额外的数据(如POST请求),可以使用`setRequestHeader()`方法设置HTTP头部信息。 4. **发送请求**:调用`send()`方法向服务器发送请求。如果是GET请求,数据作为URL的一部分;如果...

    浅析JavaScript中浏览器的兼容问题

    为了确保跨浏览器兼容性,可以使用以下代码进行能力检测,选择合适的方法来获取或设置文本内容: ```javascript if (element.textContent) { return element.textContent; } else { return element.innerText; } ...

    dom:跨浏览器的 dom 操作

    3. **创建新元素**:`createElement`是通用的方法,但设置属性和子节点时,如`innerHTML`在某些浏览器中可能不安全。可以使用`appendChild`、`setAttribute`等方法进行兼容性操作。 4. **样式操作**:`style`对象在...

    判断是不是ie8支持所有浏览器

    但在实际应用中,还需要结合多种策略和技术手段来全面解决跨浏览器兼容性问题,以确保网站能够在各种浏览器环境下都能获得良好的用户体验。随着现代浏览器的普及和HTML5/CSS3等标准的广泛应用,对于老旧浏览器如IE8...

    js innerHTML 改变div内容的方法

    - 在跨浏览器兼容性方面,`document.getElementById`是支持所有主流浏览器的方法,因此经常被用来获取DOM元素的引用。 ### 实际应用案例 例如,我们有一个网页,其中包含一个下拉列表,用户的选择可以动态更新页面...

    用谷歌浏览器得不到动态添加表单的值

    在实际项目中,为确保在各种浏览器下都能正常工作,推荐进行充分的跨浏览器测试,使用像BrowserStack或Sauce Labs这样的工具,以确保在Chrome、Firefox、Safari、Edge以及Internet Explorer等主流浏览器上的兼容性。...

    跨浏览器开发经验总结(三) 警惕“IE依赖综合症”

    可以使用`insertBefore`方法或自定义`moveRow`函数来实现跨浏览器兼容。例如,先获取需要操作的`tr`元素,然后根据目标位置插入或删除元素。 5. **浏览器检测**:在编写代码时,通常需要检测当前浏览器是否为IE,...

    innerHTML-outerHTML-innerTEXT.txt

    - 在某些情况下,浏览器可能会自动修正或调整通过 `innerHTML` 设置的 HTML,因此实际渲染的内容可能与预期有所不同。 ### 实际应用示例 假设我们有一个简单的 HTML 页面,包含一个按钮和一个 `div` 元素: ```...

    innerHTML、outerHTML、innerText、outerText的用法与区别

    在跨浏览器兼容性考虑时,由于`innerText`在非IE浏览器中的实现可能不完全相同,推荐使用`textContent`属性作为替代,因为`textContent`在所有现代浏览器中都有良好的支持,它与`innerText`类似,但不处理CSS样式。...

    innerHTML与jquery里的html()区别介绍

    jQuery 的 `.html()` 方法是围绕 `innerHTML` 进行封装的,它提供了一种更一致的跨浏览器行为。在上面的例子中,当你尝试用 jQuery 的 `.html()` 方法在 IE 中设置 `tbody` 的内容时,jQuery 实际上使用了 `try......

Global site tag (gtag.js) - Google Analytics