15

为什么自 jQuery 1.9.1 以来以下代码不起作用?与以前的版本工作正常。

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

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

在 JS 控制台中,它会发出如下错误:

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

编辑:

感谢大家快速而广泛的回答。观察到的问题是偶然发现的,当然$(document.body).append()是正确的做法。

4

4 回答 4

16

jQuery 1.9.x 调用

this[ 0 ].ownerDocument

在其buildFragment()方法之内。由于您传入document, 调用

document.ownerDocument

将引用null并导致错误。任何其他节点都将引用document,这当然可以。


结论:不要调用$(document).append()但使用$(document.body)例如。

于 2013-03-05T10:41:06.703 回答
3

你的代码永远不会起作用。它必须document.body document

以下是不同版本的一些示例不起作用:

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/
1.9.1: http: //jsfiddle.net/us9Kz/4/
jQuery 2.0.0b1:http: //jsfiddle.net/us9Kz/5/

使用代码document.body(在 jQuery 1.9.1 上):http: //jsfiddle.net/us9Kz/6/

于 2013-03-05T10:42:05.633 回答
1

为了回答你的问题,我在 JSfiddle 中尝试了所有可用的 jQuery 版本。它碰巧给出了同样的错误。

为什么它不起作用:当转换为字符串时,文档变成类似于[object HTMLDocument]的东西,当然没有这样的id,它会返回null。

以下作品:

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

或者像你一样通过对象符号来做:

var test = {
    version: '1.0'
}
$('body').append(test.version)
于 2013-03-05T10:35:27.013 回答
1

在 jQuery 代码中,它有这一行:

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

this是您选择的 jQuery 对象。在你的情况下,文件。document 的 ownerDocument 值为 null,这是传递documentdocument.createDocumentFragment();. 因此,您会得到documentnull 的错误(那里的变量命名稍有错误,因为它使您认为文档对象本身以某种方式为 null)

正如其他人所说。改为附加到正文中,它将正常工作。

于 2013-03-05T10:43:31.587 回答