2013-03-05 5 views
13

Warum das folgende Stück Code seit jQuery 1.9.1 nicht funktioniert? Mit früheren Versionen funktioniert das gut.

$(function() { 
    $(document).append(test); 
    document.write('done'); 
}); 
var test = { 
    version: "1.0", 
}; 

JSFiddle: http://jsfiddle.net/Chessjan/NsjqM/

In JS-Konsole gibt es Fehler wie folgt aus:

TypeError: document is null 
safeFrag = document.createDocumentFragment(); jquery-1.9.1.js (line 5823) 

Edit:

Vielen Dank allen für die schnelle und umfangreiche aswers. Das beobachtete Problem wurde zufällig gefunden, und natürlich ist $(document.body).append() der richtige Ansatz.

+3

Normalerweise hängen Sie Zeug an "Kopf" oder "Körper" an. Gibt es einen bestimmten Grund, Dinge an "Dokumente" anzuhängen? –

+8

Das wahre Geheimnis ist, warum es in erster Linie hätte funktionieren sollen. –

+1

Ich bin vorkomplexiert, können wir an Dokumente anhängen? weil ich denke, Dokument ist kein Element (oder Tag) wie "body" oder "html" -Tags. –

Antwort

15

jQuery 1.9.x ruft

this[ 0 ].ownerDocument 

innerhalb seiner buildFragment() Methode. Da Sie in der document passieren, der Anruf

document.ownerDocument 

werden null Referenz und den Fehler verursachen. Jeder andere Knoten wird auf die document verweisen, was natürlich funktioniert.


Fazit: Rufen Sie $(document).append() nicht aber $(document.body) zum Beispiel verwenden.

+0

Andere Antworten waren auch richtig, aber diese genau erklärte Quelle des Problems, Danke, – Chessjan

+0

+1 nette Erklärung Kumpel – 1Mayur

1

Um Ihre Frage zu beantworten, versuchte ich in JSfiddle alle verfügbaren jQuery-Versionen. Es gab zufällig denselben Fehler.

Warum es nicht funktioniert: Dokument wird so etwas wie [Objekt HTMLDocument] bei der Umwandlung in Zeichenfolge, und es gibt natürlich keine solche ID, es wird Null zurückgeben.

Die folgenden Werke:

var test = "1.0" 
$('body').append(test); 

oder Trog Objekt Notation tun wie du getan hast:

var test = { 
    version: '1.0' 
} 
$('body').append(test.version) 
+0

Sicher ein besserer Ansatz, aber beantwortet auch die Frage nicht. – jtheman

+1

Sie sind richtig, also habe ich es irgendwie bearbeitet, um die Frage zu beantworten Danke für Ihr Feedback macht mich die Frage besser lesen =) Einen schönen Tag haben –

+0

Gern geschehen (-: +1 – jtheman

1

Innerhalb des jQuery-Code hat die folgende Zeile:

jQuery.buildFragment(args, this[ 0 ].ownerDocument, false, this); 

this ist das jQuery-Objekt Sie ausgewählt haben. In Ihrem Fall das Dokument. Der ownerDocument-Wert des Dokuments ist null und wird als document an den Aufruf von document.createDocumentFragment(); übergeben. Daher erhalten Sie den Fehler, dass document ist Null (Etwas schlechte Benennung von Variablen gibt es wie Sie denken, das Dokumentobjekt selbst ist irgendwie Null)

Wie andere Leute gesagt haben. Stattdessen an den Körper anhängen und es wird gut funktionieren.

Verwandte Themen