Javascript IE innerHTML错误

Javascript IE innerHTML错误,javascript,dom,Javascript,Dom,这与在这个话题上已经提出的问题有些不同。我使用了这个建议来实现如下功能: function foo() { document.getElementById('doc1').innerHTML = '<td>new data</td>'; } var oHTMLFactory = document.createElement("span"); function createDOMElementFromHTML(sHtml) { switch (sHtm

这与在这个话题上已经提出的问题有些不同。我使用了这个建议来实现如下功能:

function foo() {

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

}
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;
}
函数foo(){
document.getElementById('doc1')。innerHTML='newdata';
}
为此:

function foo() {

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

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

}
函数foo(){
newdiv=document.createElement('div');
newdiv.innerHTML='新数据';
当前文档=document.getElementById('doc1');
当前_doc.appendChild(newdiv);
}
但这仍然不起作用。在这两种情况下,在包含innerHTML的行上都会发生“未知运行时错误”


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

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

您有两种选择:

  • 使用特定于表的API添加 单元格/行。参见示例和更多
  • 创建一个实用函数 将帮助您创建DOM节点 不受约束。对于表,您需要包装您的HTML,以便生成的HTML始终是一个表,然后通过标记名获取所需的元素 例如:

    function foo() {
    
        document.getElementById('doc1').innerHTML = '<td>new data</td>';
    
    }
    
    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;
    }
    
    var oHTMLFactory=document.createElement(“span”);
    函数createDOMElementFromHTML(sHtml){
    开关(sHtml.match(/^我发现这(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 += "";
    
    var szBR=“\r\n”;
    var szClass=“myTable”;
    var szSelector=“#divDisplay123”;
    var szSelector2=“divDisplay123”;
    var pnlID=“myTable2”;
    var szRtn=
    “+szBR+
    "";
    $(szSelector).append(szRtn);
    
    对于(var y=0;y,您可以创建自己的.innerHTML填充/polyfill。我刚刚编写了一些代码来修复IE中.innerHTML的另一个有问题的方面:清除child.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)
    

    也许我可以指出,它不是div元素的有效子元素。