Подтвердить что ты не робот

Почему $(document).append() не работает в jQuery 1.9.1?

Почему следующая часть кода не работает с 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)

Edit:

Спасибо всем за быстрые и обширные айсеры. Наблюдаемая проблема была обнаружена случайно, и, конечно, $(document.body).append() является правильным подходом.

4b9b3361

Ответ 1

jQuery 1.9.x вызывает

this[ 0 ].ownerDocument

в рамках метода buildFragment(). Поскольку вы проходите в document, вызов

document.ownerDocument

будет ссылаться на null и вызывать ошибку. Любой другой node будет ссылаться на document, который, конечно же, работает.


Вывод: не вызывайте $(document).append(), но используйте $(document.body) например.

Ответ 2

Ваш код будет никогда работать. Он должен 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/

Ответ 3

Чтобы ответить на ваш вопрос, я попробовал в JSfiddle все доступные версии jQuery. Это случилось с той же ошибкой.

Почему это не работает: документ становится чем-то вроде [object HTMLDocument] при нажатии в строку, и, конечно, нет такого идентификатора, он вернет null.

Следующие работы:

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

или сделать это через нотацию объекта, как вы это сделали:

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

Ответ 4

Внутри кода jQuery он имеет следующую строку:

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

this - выбранный объект jQuery. В вашем случае документ. Значение ownerDocument документа равно null, и это то, что передается как document для вызова document.createDocumentFragment();. Следовательно, вы получаете ошибку, которая document равна null (слабое именование имен переменных, поскольку это заставляет вас думать, что сам объект документа каким-то образом недействителен)

Как говорили другие люди. Вместо этого добавьте к телу, и он будет работать нормально.