2013-03-05 29 views
13

Tại sao đoạn mã sau không hoạt động kể từ jQuery 1.9.1? Với các phiên bản trước hoạt động tốt.

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

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

Trong JS console mà nó tạo ra lỗi như thế này:

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

Edit:

Cảm ơn tất cả mọi người cho aswers nhanh chóng và sâu rộng. Sự cố quan sát được tìm thấy một cách tình cờ, và dĩ nhiên, $(document.body).append() là cách tiếp cận thích hợp.

+3

Bạn thường nối công cụ vào 'đầu' hoặc' nội dung'. Bất kỳ lý do cụ thể nào để gắn thêm nội dung vào 'tài liệu'? –

+8

Bí ẩn thực sự là lý do tại sao nó phải có hiệu quả ngay từ đầu. –

+1

Tôi đã chuẩn bị sẵn sàng, chúng tôi có thể thêm vào tài liệu không? bởi vì tôi nghĩ, tài liệu không phải là một phần tử (hoặc thẻ) như các thẻ 'body' hoặc' html'. –

Trả lời

15

jQuery 1.9.x gọi

this[ 0 ].ownerDocument 

trong phương pháp buildFragment() của nó. Kể từ khi bạn vượt qua trong document, cuộc gọi

document.ownerDocument 

sẽ tham khảo để null và gây ra lỗi. Bất kỳ nút nào khác sẽ tham chiếu đến document, tất nhiên, hoạt động.


Kết luận: Không gọi $(document).append() nhưng sử dụng $(document.body) chẳng hạn.

+0

Câu trả lời khác cũng đúng giải thích nguồn gốc của vấn đề. Cảm ơn bạn – Chessjan

+0

+1 lời giải thích tốt đẹp – 1Mayur

1

Để trả lời câu hỏi của bạn, tôi đã thử trong JSfiddle tất cả các phiên bản jQuery có sẵn. Nó đã xảy ra để cung cấp cho cùng một lỗi.

Tại sao nó không hoạt động: tài liệu trở thành một cái gì đó như [đối tượng HTMLDocument] khi đúc thành chuỗi, và tất nhiên không có id như vậy, nó sẽ trả về null.

Các công trình sau đây:

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

hoặc làm nó chú thích đối tượng máng như bạn đã làm:

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

Chắc chắn một cách tiếp cận tốt hơn, nhưng cũng không trả lời câu hỏi. – jtheman

+1

bạn là đúng vì vậy tôi đã chỉnh sửa bằng cách nào đó để trả lời câu hỏi nhờ phản hồi của bạn khiến tôi đọc câu hỏi tốt hơn =) có một ngày tốt đẹp –

+0

Bạn được chào đón (-: +1 – jtheman

3

Mã của bạn sẽ là chưa bao giờ hoạt động. Nó phải document.bodykhôngdocument.

Dưới đây là một vài ví dụ trong các phiên bản khác nhau của nó không làm việc:

jQuery 1.6.4: http://jsfiddle.net/us9Kz/
jQuery 1.7.2: http://jsfiddle.net/us9Kz/1/
jQuery 1.8.3: http://jsfiddle.net/us9Kz/3/
jQuery 1.9. 1: http://jsfiddle.net/us9Kz/4/
jQuery 2.0.0b1: http://jsfiddle.net/us9Kz/5/

Mã hoạt động với document.body (trên jQuery 1.9.1): http://jsfiddle.net/us9Kz/6/

1

Bên trong mã jQuery nó có dòng này:

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

this là đối tượng jQuery bạn đã chọn. Trong trường hợp của bạn, tài liệu. Giá trị tài liệu ownerDocument là null và đây là giá trị được chuyển qua như document đến cuộc gọi đến document.createDocumentFragment();. Do đó bạn nhận được lỗi rằng document là null (Hơi xấu đặt tên của các biến đó vì nó làm cho bạn nghĩ rằng đối tượng tài liệu chính nó là bằng cách nào đó null)

Như những người khác đã nói. Gắn vào cơ thể thay vào đó và nó sẽ hoạt động tốt.

Các vấn đề liên quan