2010-11-12 7 views
7

Auf dieser Seite http://blog.zacharyvoase.com/2010/11/11/sockets-and-nodes-i/ wird durch Ausführen des folgenden Codes in JavaScript-Konsole eine Ausnahme ausgelöst.DOM Ausnahme beim Zuweisen von HTML-Entities zu innerHTML

var div = document.createElement('div'); div.innerHTML = "»"; 
  • Chrome 8.0.552.28 Mac: Fehler: INVALID_STATE_ERR: DOM Exception 11
  • Firebug in Firefox 3.6.12 Mac: NS_ERROR_DOM_SYNTAX_ERR Eine ungültige oder illegale Zeichenfolge
  • Safari 5.0.2 Mac angegeben wurde: Fehler: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7
    Opera: Werke

gut, aber es funktioniert gut in allen anderen Seiten habe ich versucht. Meine Fragen sind Was ist das Besondere an der Seite und Warum werfen Chrome und Firefox eine Ausnahme?

Das Schreiben des Zeichens direkt ohne Entity funktioniert gut.

var div = document.createElement('div'); div.innerHTML = "»"; 

Die Verwendung anderer Entitäten funktioniert auch, z.

var div = document.createElement('div'); div.innerHTML = "<"; 
+0

Welche Version von Chrom? Ich sehe keine, aber ich bin in Chrome 9.0 dev. – theazureshadow

+0

Ich sehe keinen Fehler in Firebug entweder ... –

+0

Danke. Ich habe der Beschreibung Versionsinformationen hinzugefügt. – Arrix

Antwort

16

Ich beantworte meine eigene Frage.

Die kurze Antwort: Es ist wegen der Browser-Beschränkung.

Wenn eine Seite von bestimmten Browsern als XHTML erkannt wird, wird nur eine Teilmenge der vom Standard zugelassenen benannten Zeichenentitäten für die innerHTML-Zuweisung unterstützt.

Insbesondere in meinen Tests scheint es, dass in Mozilla und WebKit, nur ", &, < und > in innerHTML- Zuordnung erlaubt sind.

Mein Testcode ist hier verfügbar: https://gist.github.com/673901

XHTML ist eine "bessere" und sauberere Version von HTML in XML neu formuliert. XHTML 1.1 sollte der Nachfolger und die Zukunft von HTML sein. Dies wird jedoch mit der Übernahme von HTML5 wahrscheinlich nicht passieren.

Im Gegensatz zu HTML, das einen dedizierten HTML-Parser benötigt, kann ein XHTML-Dokument von einem allgemeinen XML-Parser analysiert werden. Zumindest in Mozilla und Webkit durchlaufen XHTML und HTML verschiedene Codepfade. Es ist verständlich, dass der HTML-Code-Pfad am meisten verwendet wird und auch besser getestet wird, da es weit mehr HTML-Dokumente gibt als XHTML.

Es ist erwähnenswert, dass die Frage, ob ein Dokument als XHTML erkannt wird, durch den effektiven MIME-Typ und nicht durch den Dokumentinhalt bestimmt wird.

Die Schlussfolgerung ist, dass wenn Sie mit XHTML arbeiten, stellen Sie sicher, dass Sie benannte Entities in numerische Entities konvertieren (z. B.   -> ), bevor Sie .innerHTML zuweisen.

+3

+1, gut gemacht, um es selbst herauszufinden. –

+0

Beachten Sie, dass HTML5 sowohl eine HTML- als auch eine XHTML-Serialisierung aufweist. Außerdem ist innerHTML in XHTML jetzt ziemlich spröde, aber das wird sich wahrscheinlich mit der tatsächlichen Spezifikation von innerHTML in HTML5 verbessern. – Ms2ger

+0

Die gruselige Sache ist, dass, wenn ich HTML-Dokument von HTML auf ** derselben Seite ** ('document.documentElement.innerHTML') erzeuge, ich diesen Fehler auch erhalte. –

1

Es scheint, als ob erwartet wird, dass Sie versuchen, codiertes HTML hinzuzufügen, es wird jedoch als fehlerhaft erkannt.
Tut var div = document.createElement('div'); div.innerHTML = "»"; tun, was Sie brauchen?

Per Kommentar: var dv = document.createElement('div'); dv.innerHTML = "»"; document.getElementById('test').appendChild(dv);

bekam ich die codierten Zeichen here.

Sie haben Recht, dass » gültige codierte HTML ist. Ich kann nur vermuten, dass es eine Einschränkung des Browsers ist.

+0

Was ich versuche zu tun ist div.innerHTML = "» ", was gut funktioniert. Ich frage mich jedoch, warum eine Ausnahme geworfen wird, weil ich denke, dass die HTML-Entität gültig ist. – Arrix

+0

siehe oben bearbeiten. – Laramie