15 votes

Pourquoi $(document).append() ne fonctionne pas dans jQuery 1.9.1 ?

Pourquoi le code suivant ne fonctionne-t-il pas depuis jQuery 1.9.1 ? Avec les versions précédentes, tout fonctionne bien.

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

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

Dans la console JS, l'erreur est la suivante :

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

Edita:

Merci à tous pour vos réponses rapides et détaillées. Le problème observé a été trouvé par accident, et bien sûr, $(document.body).append() est une approche appropriée.

16voto

jAndy Points 93076

Appels jQuery 1.9.x

this[ 0 ].ownerDocument

au sein de son buildFragment() méthode. Puisque vous transmettez le document , l'appel

document.ownerDocument

fera référence à null et provoquer l'erreur. Tout autre nœud référencera le document ce qui, bien entendu, fonctionne.


Conclusion : Ne pas appeler $(document).append() mais utiliser $(document.body) par exemple.

3voto

mattytommo Points 27587

Votre code comprendra jamais a travaillé. Il faut document.body pas document .

Voici quelques exemples de dysfonctionnements dans différentes versions :

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/

Code fonctionnant avec document.body (sur jQuery 1.9.1) : http://jsfiddle.net/us9Kz/6/

1voto

Matthias Wegtun Points 449

Pour répondre à votre question, j'ai essayé dans JSfiddle toutes les versions de jQuery disponibles. Il s'est avéré que la même erreur s'est produite.

Pourquoi cela ne fonctionne pas : document devient quelque chose comme [object HTMLDocument] lorsqu'il est transformé en chaîne de caractères, et il n'y a bien sûr pas d'identifiant de ce type, cela renverra null.

Les ouvrages suivants :

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

ou en utilisant la notation d'objet comme vous l'avez fait :

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

1voto

Richard Dalton Points 20402

Dans le code jQuery, il y a cette ligne :

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

this est l'objet jQuery que vous avez sélectionné. Dans votre cas, il s'agit du document. La valeur ownerDocument de document est null et c'est ce qui est transmis en tant que document à l'appel à document.createDocumentFragment(); . Vous obtenez donc l'erreur suivante document est null (le nom des variables est légèrement mauvais car il laisse penser que l'objet document lui-même est en quelque sorte null)

Comme d'autres l'ont dit. Ajoutez plutôt au corps et cela fonctionnera bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X