为什么$(document).append()在jQuery 1.9.1中不起作用?

时间:2013-03-05 10:29:26

标签: javascript jquery

为什么从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 个答案:

答案 0 :(得分:16)

jQuery 1.9.x调用

this[ 0 ].ownerDocument

buildFragment()方法中。由于您传递了document,呼叫

document.ownerDocument

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


结论:请勿拨打$(document).append(),但请使用$(document.body)

答案 1 :(得分: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/
jQuery 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/

答案 2 :(得分:1)

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

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

以下作品:

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

或者通过对象符号来执行此操作:

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

答案 3 :(得分:1)

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

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

this是您选择的jQuery对象。在你的情况下,文件。 document的ownerDocument值为null,这是document传递给document.createDocumentFragment();的调用。因此,您得到document为空的错误(变量命名稍差,因为它使您认为文档对象本身在某种程度上为空)

正如其他人所说。相反贴在身上,它会正常工作。