2013-03-05 10 views
13

Dlaczego następujący fragment kodu nie działa od jQuery 1.9.1? W poprzednich wersjach działa dobrze.

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

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

W konsoli JS wystawia błąd tak:

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

Edit:

Dzięki wszystkim za szybkie i rozległe aswers. Obserwowany problem został znaleziony przez przypadek, i oczywiście, $(document.body).append() jest właściwe podejście.

+3

Zazwyczaj dodajesz rzeczy do "głowy" lub "ciała". Jakiś konkretny powód dołączania rzeczy do "dokumentu"? –

+8

Prawdziwą tajemnicą jest to, dlaczego powinna ona zadziałać w pierwszej kolejności. –

+1

Jestem wstępnie zakłopotany, czy możemy dołączyć do dokumentu? ponieważ myślę, że dokument nie jest elementem (lub tagiem), jak znaczniki 'body' lub' html'. –

Odpowiedz

15

jQuery 1.9.x zwraca

this[ 0 ].ownerDocument 

w jego metodzie buildFragment(). Ponieważ przechodzą w document, wywołanie

document.ownerDocument 

będzie odwoływać się do null i spowodować błąd. Każdy inny węzeł będzie odwoływał się do document, co oczywiście działa.


Wniosek: Nie nazywaj $(document).append() ale korzystać $(document.body) na przykład.

+0

Inne odpowiedzi również były słuszne, ale ten dokładnie wyjaśniono źródło problemu Dziękujemy – Chessjan

+0

+1 sympatyczny kumpel – 1Mayur

1

Aby odpowiedzieć na twoje pytanie, wypróbowałem w JSfiddle wszystkie dostępne wersje jQuery. Zdarzył się ten sam błąd.

Dlaczego to nie działa: dokument staje się czymś w rodzaju [obiektu HTMLDocument] po rzutowaniu na ciąg znaków i oczywiście nie ma takiego id, zwróci wartość null.

następujące utwory:

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

lub robi to trough notacji obiektu jak ty:

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

Oczywiście lepsze podejście, ale też nie odpowiada na pytanie. – jtheman

+1

masz rację, więc zredagowałem to w jakiś sposób, aby odpowiedzieć na pytanie dzięki za twoją opinię sprawia, że ​​przeczytałem pytanie lepiej =) miłego dnia –

+0

Nie ma za co (-: +1 – jtheman

1

Wewnątrz kodu jQuery ma ten wiersz:

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

this jest przedmiotem jQuery została wybrana. W twoim przypadku dokument. Wartość ownerDocument dokumentu ma wartość null, a to jest przekazywane jako document do połączenia z document.createDocumentFragment();. W związku z tym pojawia się błąd, który oznacza, że ​​document ma wartość null (nieznaczne złe nazewnictwo zmiennych, ponieważ powoduje, że sam obiekt dokumentu jest w jakiś sposób pusty)

Jak powiedzieli inni ludzie. Dołącz zamiast tego do ciała i będzie działało dobrze.

Powiązane problemy