IE innerHTML错误

时间:2009-06-30 22:36:44

标签: javascript dom

这与已就此主题提出的问题略有不同。我用这个建议来改变这样的函数:

function foo() {

    document.getElementById('doc1').innerHTML = '<td>new data</td>';

}

进入这个:

function foo() {

    newdiv = document.createElement('div');
    newdiv.innerHTML = '<td>new data</td>';

    current_doc = document.getElementById('doc1');
    current_doc.appendChild(newdiv);

}

但这仍然无效。在两种情况下,包含innerHTML的行都会出现“未知的运行时错误”。

我认为创建newdiv元素并在其上使用innerHTML可以解决问题吗?

3 个答案:

答案 0 :(得分:4)

无法在Internet Explorer中单独创建td或tr。同样的问题在其他浏览器中也存在了相当长的一段时间,但是这些问题的最新版本不再受此问题的影响。

您有两个选项:

  1. 使用特定于表的API进行添加 细胞/行。请参阅示例MSDN for insertCell及更多
  2. 创建一个实用程序功能 可以帮助您创建DOM节点 没有字符串。如果是表格,您需要将HTML包装起来,以便生成的HTML始终是一个表格,然后按标签名称获取所需的元素。
  3. 例如:

    var oHTMLFactory = document.createElement("span");
    function createDOMElementFromHTML(sHtml) {
        switch (sHtml.match(/^<(\w+)/)) {
            case "td":
            case "th":
                sHtml   = '<tr>' + sHtml + '</tr>';
                // no break intentionally left here
            case "tr":
                sHtml   = '<tbody>' + sHtml + '</tbody>';
                // no break intentionally left here
            case "tbody":
            case "tfoot":
            case "thead":
                sHtml   = '<table>' + sHtml + '</table>';
                break;
            case "option":
                sHtml   = '<select>' + sHtml + '</select>';
        }
        oHTMLFactory.innerHTML = sHtml;
    
        return oAML_oHTMLFactory.getElementsByTagName(cRegExp.$1)[0] || null;
    }
    

    希望这有帮助!

答案 1 :(得分:0)

我发现这个(innerHTML + =“”)会导致表格出现。缺点是应用于表格或表格内元素的任何javascript事件都会被吹走。

var szBR = "\r\n";
var szClass = "myTable";
var szSelector = "#divDisplay123";
var szSelector2 = "divDisplay123";

var pnlID = "myTable2";

var szRtn =
"<table id=\"" + pnlID + "\" class=\"" + szClass + "\" >" + szBR +
"</table>";
$(szSelector).append (szRtn);

for (var y=0; y<10; y++)
{
    var pnlID_TR = pnlID + "_TR_" + y;

    szRtn =
    "   <tr id=\"" + pnlID_TR + "\" class=\"" + szClass + "_TR\">" + szBR +
    "   </tr>";
    $("#" + pnlID).append (szRtn);

    for (var x=0; x<5; x++)
    {
        var pnlID_TD = pnlID + "_TD_" + x + "_" + y;

        szRtn =
        "       <td id=\"" + pnlID_TD + "\" class=\"" + szClass + "_TD\">" + szBR +
        "Hello World2" + szBR +
        "       </td>";
        $("#" + pnlID_TR).append (szRtn);
    }
}

$(szSelector).append ("<HR>");        
document.getElementById (szSelector2).innerHTML += "";

答案 2 :(得分:0)

您可以创建.innerHTML自己的填充/填充。我刚刚制作了一些代码来解决IE中.innerHTML的另一个问题:清除子.innerHTMLs:

您可以修改行为。这里有一些代码可以防止IE中其他引用元素的垃圾收集:

if (/(msie|trident)/i.test(navigator.userAgent)) {
 var innerhtml_get = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").get
 var innerhtml_set = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").set
 Object.defineProperty(HTMLElement.prototype, "innerHTML", {
  get: function () {return innerhtml_get.call (this)},
  set: function(new_html) {
   var childNodes = this.childNodes
   for (var curlen = childNodes.length, i = curlen; i > 0; i--) {
    this.removeChild (childNodes[0])
   }
   innerhtml_set.call (this, new_html)
  }
 })
}

var mydiv = document.createElement ('div')
mydiv.innerHTML = "test"
document.body.appendChild (mydiv)

document.body.innerHTML = ""
console.log (mydiv.innerHTML)

http://jsfiddle.net/DLLbc/9/