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的重要性**...
不同的浏览器在实现DOM API时可能存在细微差异,例如`innerHTML`属性或`addEventListener`方法。统一使用DOM Level 2和3标准可以减少这种问题。 4. **事件处理**: 事件处理在不同浏览器间也存在差异,如事件冒泡...
症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在某种浏览器上有效,但在其它浏览器上无效。 原因:不同浏览器对插入 innerHTML ...* 描述:跨浏览器的设置 in
跨浏览器兼容写法建议使用`document.querySelectorAll`或`document.querySelectorAll`方法,因为这两个方法在现代浏览器中得到了良好支持。 在IE 6及更早版本中,`obj.getAttribute`可以用来访问元素的固有属性和...
同时,也是对编写跨浏览器代码的一种提醒,即应当考虑不同浏览器和不同版本之间的兼容性问题,尤其是在处理DOM操作和使用第三方库时。对于开发者而言,始终关注最新的浏览器动态,理解各个浏览器的DOM模型差异,并在...
因此,我们需要使用兼容写法来实现跨浏览器支持。 方法二:添加自带伪类的类名 添加自带伪类的类名是一种简单的方法。我们可以在CSS中定义一个类,然后使用JavaScript将该类添加到需要设置js效果的元素上。例如,...
#### 四、跨浏览器的设置InnerHTML方法 在不同的浏览器中,`innerHTML`的处理方式可能会有所不同。特别是在涉及脚本标签时,需要特别注意: - **IE浏览器**:要求脚本标签带有`defer`属性,并且元素必须存在于DOM...
这个现象在其他现代浏览器中并不常见,因此了解这一问题对于解决跨浏览器兼容性问题至关重要。 `innerHTML`是JavaScript中一个非常实用的属性,用于获取或设置HTML元素内部的HTML内容。当你为一个元素设置`...
3. **设置请求头**:如果需要发送额外的数据(如POST请求),可以使用`setRequestHeader()`方法设置HTTP头部信息。 4. **发送请求**:调用`send()`方法向服务器发送请求。如果是GET请求,数据作为URL的一部分;如果...
为了确保跨浏览器兼容性,可以使用以下代码进行能力检测,选择合适的方法来获取或设置文本内容: ```javascript if (element.textContent) { return element.textContent; } else { return element.innerText; } ...
3. **创建新元素**:`createElement`是通用的方法,但设置属性和子节点时,如`innerHTML`在某些浏览器中可能不安全。可以使用`appendChild`、`setAttribute`等方法进行兼容性操作。 4. **样式操作**:`style`对象在...
但在实际应用中,还需要结合多种策略和技术手段来全面解决跨浏览器兼容性问题,以确保网站能够在各种浏览器环境下都能获得良好的用户体验。随着现代浏览器的普及和HTML5/CSS3等标准的广泛应用,对于老旧浏览器如IE8...
- 在跨浏览器兼容性方面,`document.getElementById`是支持所有主流浏览器的方法,因此经常被用来获取DOM元素的引用。 ### 实际应用案例 例如,我们有一个网页,其中包含一个下拉列表,用户的选择可以动态更新页面...
在实际项目中,为确保在各种浏览器下都能正常工作,推荐进行充分的跨浏览器测试,使用像BrowserStack或Sauce Labs这样的工具,以确保在Chrome、Firefox、Safari、Edge以及Internet Explorer等主流浏览器上的兼容性。...
可以使用`insertBefore`方法或自定义`moveRow`函数来实现跨浏览器兼容。例如,先获取需要操作的`tr`元素,然后根据目标位置插入或删除元素。 5. **浏览器检测**:在编写代码时,通常需要检测当前浏览器是否为IE,...
- 在某些情况下,浏览器可能会自动修正或调整通过 `innerHTML` 设置的 HTML,因此实际渲染的内容可能与预期有所不同。 ### 实际应用示例 假设我们有一个简单的 HTML 页面,包含一个按钮和一个 `div` 元素: ```...
在跨浏览器兼容性考虑时,由于`innerText`在非IE浏览器中的实现可能不完全相同,推荐使用`textContent`属性作为替代,因为`textContent`在所有现代浏览器中都有良好的支持,它与`innerText`类似,但不处理CSS样式。...
jQuery 的 `.html()` 方法是围绕 `innerHTML` 进行封装的,它提供了一种更一致的跨浏览器行为。在上面的例子中,当你尝试用 jQuery 的 `.html()` 方法在 IE 中设置 `tbody` 的内容时,jQuery 实际上使用了 `try......