Вопрос по javascript, dom – IE innerHTML error

2

Это немного отличается от вопросов, которые уже задавались по этой теме. Я использовал этот совет, чтобы включить такую функцию:

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 для этого решит проблему?

Возможно, я мог бы просто указать, что & lt; td & gt; не является допустимым дочерним элементом элемента div. Ian Elliott

Ваш Ответ

3   ответа
0

лько что сделал некоторый код, чтобы исправить еще один проблемный аспект .innerHTML в IE: очистка дочерних .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/

4

лема существовала и в других браузерах уже довольно давно, однако последние версии больше не страдают от этой проблемы.

У вас есть 2 варианта:

Use table specific APIs to add cells/rows. See for example MSDN for insertCell and more Create a utility function, that would help you creating DOM nodes out of strings. In case of a table you would need to wrap up your HTML so that the resulting HTML is always a table and then get required element by tag name.

Например, вот так:

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;
}

Надеюсь это поможет!

0

& quot;) приведет к появлению таблицы. Обратной стороной является то, что любые события 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 += "";

Похожие вопросы