2008-09-30 5 views
6

Ich habe versucht, innerHTML auf ein Element in Firefox einzustellen und es hat gut funktioniert, versuchte es in IE und hat unerwartete Fehler ohne ersichtlichen Grund warum.Warum gibt IE unerwartete Fehler bei der Einstellung innerHTML

Zum Beispiel, wenn Sie versuchen, die innereHTML einer Tabelle auf "hi from stu" zu setzen, wird es fehlschlagen, weil der Tabelle eine Sequenz folgen muss.

+1

Ein Codeauszug nützlich hätte sein können ... –

Antwort

0

„Anscheinend firefox ist das nicht pingelig“ ==> Anscheinend FireFox ist so fehlerhaft, dass es diese offensichtliche Verletzung der grundlegenden HTML-Verschachtelung Regeln nicht registrieren ...

Als jemand in einem anderen darauf hingewiesen, Forum wird FireFox annehmen, dass Sie eine ganze hTML-Dokument als Kind eines form Feld anhängen oder sogar ein Bild, - (

+6

Der Zweck von Browsern ist es, die Informationen, die dem Benutzer zur Verfügung gestellt werden, so gut wie möglich zu präsentieren - das heißt, versuchen, sich von Autorfehlern zu erholen. – Quentin

-2

Ich habe gerade herausgefunden, dass wenn Sie versuchen, innerHTML auf ein Element im IE zu setzen, das nicht logisch korrekt ist, wird dieser Fehler ausgelöst. Wenn Sie zum Beispiel versuchen, innerHTML einer Tabelle auf "hi from stu" zu setzen, wird es fehlschlagen, weil der Tabelle eine Sequenz folgen muss. Anscheinend ist Firefox nicht so wählerisch. Hoffe es hilft.

+0

Mein Punkt hier war: Stackoverflow sollte eine sein Ort, an dem die Leute gute technische Antworten auf technische Fragen geben konnten. Ich hatte etwas nicht offensichtliches herausgefunden und dachte, ich würde es der Wissensdatenbank hinzufügen. Es gibt keine Möglichkeit, das zu tun, ohne eine Frage zu stellen, also tat ich es und beantwortete es. – stu

+0

Sie könnten downvoted werden, weil die meisten dieser Antwort tatsächlich in der Frage gehört - Sie haben ursprünglich nicht genau gesagt, was Sie versuchten zu tun. Ich habe jetzt etwas davon auf die Frage übertragen. –

3

Ich weiß nicht, warum Sie für die Frage Stu down-modded sind, da dies etwas ist, das ich kürzlich gelöst habe. Der Trick besteht darin, den HTML-Code in ein DOM-Element zu "squirten", das derzeit nicht an den Dokumentbaum angehängt ist. Hier ist der Code-Schnipsel, die es tut:

// removing the scripts to avoid any 'Permission Denied' errors in IE 
var cleaned = html.replace(/<script(.|\s)*?\/script>/g, ""); 

// IE is stricter on malformed HTML injecting direct into DOM. By injecting into 
// an element that's not yet part of DOM it's more lenient and will clean it up. 
if (jQuery.browser.msie) 
{ 
    var tempElement = document.createElement("DIV"); 
    tempElement.innerHTML = cleaned; 
    cleaned = tempElement.innerHTML; 
    tempElement = null; 
} 
// now 'cleaned' is ready to use... 

Hinweis verwenden wir nur mit jQuery in diesem Schnipsel hier zu testen, ob der Browser IE, gibt es keine harte Abhängigkeit von jQuery.

0

Setzen Sie ein völlig anderes innerHTML oder ersetzen ein Muster in der innerenHTML? Ich frage, denn wenn Sie versuchen, eine triviale Suche/Ersetzung über die "Power" von innerHTML durchzuführen, werden Sie einige Arten von Elementen finden, die nicht im IE spielen.

Dies kann vorsichtig behoben werden, indem Sie Ihren Versuch in einem Versuch/Catch und sprudeln Sie das DOM über ParentNode, bis Sie es erfolgreich verwalten.

Aber das wird nicht geeignet sein, wenn Sie brandneuen Inhalt einfügen.

1

Überprüfen Sie den Gültigkeitsbereich des Elements, das Sie versuchen, das innerHTML festzulegen. da FF und IE dies auf eine andere Weise behandeln

14

Sie sehen dieses Verhalten, weil innerHTML für Tabellenelemente in IE schreibgeschützt ist. Von innerHTML Property Dokumentation MSDN:

Das Anwesen ist Lesen/Schreiben für alle Objekte mit Ausnahme der folgenden, für die sie schreibgeschützt ist: COL, COLGROUP, FRAMESET, HEAD, HTML, Stil, Tabelle, TBODY, TFOOT THEAD, TITEL, TR.

+0

Es verursachte auch Probleme für mich auf dem SCRIPT-Objekt. –

1
+0

Interessante Geschichte. Es ist keine große Sache, dass IE diesen Fehler hat. Allerdings bin ich sauer, dass sie seit mindestens 12 Jahren von diesem Virus wissen und es ist immer noch nicht behoben. Es ist in IE8. –

1

ich mit dem Problem wurde von kämpft eine Liste von Links in einer Tabelle mit einer anderen Liste von Links zu ersetzen. Wie oben erwähnt, kommt das Problem mit IE und seiner Eigenschaft readonly von Tabellenelementen.

Append für mich war keine Option, also habe ich (endlich) herausgearbeitet das (was funktioniert für Ch, FF und IE 8.0 (noch zu versuchen, andere - aber ich bin hoffnungsvoll)).

replaceInReadOnly(document.getElementById("links"), "<a href>........etc</a>"); 

function replaceInReadOnly(element, content){ 
    var newNode = document.createElement(); 
    newNode.innerHTML = content; 
    var oldNode = element.firstChild; 
    var output = element.replaceChild(newNode, oldNode); 
} 

Werke für mich - ich hoffe, es funktioniert für Sie

0

Sie das Verhalten ändern können. Hier ist ein Code, der Garbage Collection von sonst erwähnten Elemente im IE verhindert:

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/

Verwandte Themen