Почему $(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)

Редактировать:

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

4 ответа

Решение

jQuery 1.9.x звонки

this[ 0 ].ownerDocument

в его buildFragment() метод. Так как вы проходите в document, вызов

document.ownerDocument

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


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

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

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

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

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

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

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

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

Внутри кода jQuery есть эта строка:

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

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

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

Другие вопросы по тегам