`
lixw
  • 浏览: 200906 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JavaScript在IE下设置innerHTML时出现"未知的运行时错误"

阅读更多

转自:http://be-evil.org/showlog-31.html

今天在项目开发中遇到的比较郁闷的问题,特此记录:

程序代码思路大致如下,想动态的改变tr标签的innerHTML内容,但是IE却报"未知的运行时错误",让我百思不得其解.

<script>
document.getElementById('trone').innerHTML = '<td>haha</td>';
</script>

<tr id=‘trone’>
</tr>
 

在网上一段查找获得以下解法:

在Ajax里经常会通过innerHTML来改变界面,这个比使用DOM要简单一些。
比如:

element.innerHTML = "<b>something</b>";
 


不过,在IE中,有时候会出现"未知的运行时错误(unknown runtime error)",而在firefox里不会。

这主要是IE在对innerHTML进行写操作的时候会检查element是否具备做为这些内容中html对象容器的要求,比如如果你是在一个p里加入包含<li>的html代码,这是会出错的。所以如果你发现这些错误出现,尝试做两件事情:

1、检查你尝试加到innerHTML的html代码是否包含破损的html标签,如没有<ul></ul>包围的<li></li>.
2、把你的容器改成那些比较“包容”的标签,如<span></span>,<div></div>

特别注意的是<tbody>,<table>,<tr>标签里面加正确格式的<td>标签都有可能出错,所以应该避免使用这些标签作为容器,必要时可以用<td>作为容器,再嵌套一层表格。

跨浏览器的设置innerHTML方法

2006年11月06日 星期一 09:37 A.M.

innerTEXT与innerHTML的区别:

很多人都可能遇到过这种情况:设置 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 跑起来 》。比较起来,《让》给出的方法考虑得更细致,但处理起来比较繁琐,效率不高。而这里给出的方法则更简单,并且充分利用了浏览器的特性。

分享到:
评论

相关推荐

    Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法

    [removed] ”trone”&gt; &lt;/tr&gt; 在IE中,有时候会出现”未知的运行时错误(unknown runtime error)”,而在firefox里不会。 这主要是IE在对innerHTML进行写操作的时候会检查element是否具备做为这些内容中html对象容器的...

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

    本文实例讲述了js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法。分享给大家供大家参考。具体分析如下: 问题描述: 网站中使用了一个js插件,设置innerHTML时,在IE8下报错“未知运行时错误”: ...

    CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法

    总结起来,解决CodeMirror2在IE7/IE8下出现的“未知运行时错误”的关键在于理解`innerHTML`在老版本IE中的限制,以及调整HTML结构以避免使用不支持此属性的元素。通过将`textarea`移出`&lt;p&gt;`元素并放入`&lt;div&gt;`中,...

    basic.js 解决IE9不兼容的jsp,html中的验证。

    6. **DOM操作**:IE9在处理DOM操作时可能存在一些非标准行为,如`innerHTML`的使用。`basic.js`可能会包含一些工作函数来处理这些问题。 7. **ES5方法**:一些ES5的新特性,如`Array.prototype.forEach()`、`Array....

    JavaScript在IE中“意外地调用了方法或属性访问”

    在这段代码中,尝试通过设置`innerHTML`属性来修改`p`标签的内容,但在IE中直接插入`&lt;CENTER&gt;`标签会导致运行时错误。这是因为IE对某些特定的HTML标签有严格的限制。 4. **经典的“无法打开Internet站点”异常** ...

    IE6-IE9使用JSON、table[removed]所引发的问题

    但在IE的兼容模式下,尝试更改`table`、`thead`、`tfoot`、`tbody`、`tr`、`col`、`colgroup`、`html`、`title`、`style`、`frameset`等元素的`innerHTML`时,会出现“未知的运行时错误”。这是因为这些元素的`...

    label标签使用过程中遇到的问题分析及解决思路

    而在IE6, 7, 8这些较旧版本的浏览器中,JavaScript引擎对DOM操作的错误检测更为严格,因此在尝试访问或修改`innerText`或`innerHTML`属性时,会导致“未知的运行时错误”。 为了解决这个问题,开发者应该首先检查并...

    正确的4种挂马方式(属于比较简单的) - 京华志

    在挂马场景中,攻击者会利用目标网站的安全漏洞,在网页中插入一个不可见(宽度和高度设置为0)的`&lt;iframe&gt;`标签,并将其源链接指向恶意站点。用户访问目标网站时,恶意代码会在后台静默加载并执行,导致用户的电脑...

    javascript eval&#40;func(&#41;)使用示例

    例如,如果有一系列的元素(如div1, div2, div3...),而这些元素的ID是未知的,我们可以使用for循环来生成这些ID,并用eval()来设置元素的innerHTML属性,如示例中的“document.getElementById("div"+loop)....

    javascript学习笔记(七)Ajax和Http状态码

    Ajax技术是一种在不重新加载整个页面的情况下,能够与服务器交换数据并更新部分网页的技术。它最早由Google在其产品如Google地图中使用,随着其便捷性和高效性,逐渐成为Web开发的标准做法之一。 在JavaScript中,...

    动态创建样式表在各浏览器中的差异测试代码

    在非IE浏览器中,我们不能直接用`innerHTML`或`cssText`属性,因为它们可能导致未知错误,比如在IE中那样抛出"unknow runtime error"。 为了确保在所有浏览器中都能正确地动态创建和应用CSS样式,开发者需要编写...

    JS常用语句整理(推荐)

    使用`try...catch...finally`处理可能出现的错误,`try`块包含可能出错的代码,`catch`块捕获错误,`finally`块无论是否发生错误都会执行。 12. 事件处理 JS可以监听用户的交互事件,如点击、提交表单等,通过`...

    ajax原理,xmlHttpRequest

    AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。其核心在于使用`XMLHttpRequest`对象进行后台数据交互。本文将深入探讨AJAX的基本...

    兼容Firefox的Javascript XSLT 处理XML文件

    本文主要讨论如何在Firefox浏览器中使用JavaScript和XSLT来处理XML文件,以及与IE浏览器的兼容性问题。 一、XSLTProcessor对象 在Firefox浏览器中,可以使用XSLTProcessor对象来执行XSLT转换。XSLTProcessor对象...

    html5shiv:html5shiv集成

    这些新元素包括, , , , , 等,它们在现代浏览器中能够很好地工作,但在IE的老版本中则被视为未知标签,从而导致样式失效或者无法正常布局。 HTML5 Shiv的工作原理是通过JavaScript动态创建这些HTML5元素,并赋予...

    2021大厂前端秋季招聘面试(社招+校招)核心面试点(第三期)1

    在这个例子中,攻击者可以在输入框中输入JavaScript代码,点击按钮后,这些代码将被插入到页面的`&lt;div&gt;`中并执行。 前端开发人员必须了解并掌握这些安全概念,以确保开发的Web应用能够有效防御各种安全攻击,保护...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    在XML文档中,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列...

Global site tag (gtag.js) - Google Analytics