jQuery d'après la méthode ne fonctionne pas avec les nouveaux éléments
Dans la mesure où je peux dire, le code suivant devrait fonctionner, la création d'un <div>
élément, puis en créant une <p>
élément; l'expression devrait aboutir à un objet jQuery avec deux éléments:
$("<div>first element's content</div>").after("<p>second element's content</p>");
Cependant, ce que je reçois est très différent. La documentation (voir la rubrique "Insertion Déconnecté Nœuds DOM") raconte-moi le code ci-dessus devrait aboutir à un objet jQuery, saisissant toutes les deux bouts de code HTML et construire les deux éléments du DOM. Mais, ce que j'ai obtenu, dans les différentes versions de jQuery, tous au-dessus de 1.4, est un objet jQuery avec seulement 1 nœud. Toutefois, le code suivant fonctionne très bien, le retour (ce que je crois) le bon objet jQuery, deux éléments à l'intérieur:
$("<div></div>").after("<p>second element's content</p>");
Et que cet exemple fonctionne ainsi:
$("<div></div>").after("<p>second element's content</p>").after("<p>third element's content</p>");
Il semble que le .after()
méthode fonctionne bien si le premier nœud DOM créé est vide, mais ne fonctionne pas quand il n'est pas (quel que soit le contenu de la suite des nœuds DOM d'être ajouté).
Suis-je raté quelque chose à propos de jQuery-même, bizarre DOM questions et/ou JavaScript particularités, ou est-ce simplement un jQuery bug qui a persisté à partir de la version 1.4 à travers 1.7?
(Voici un maigre JSFiddle démontrant la question assez clairement.)
- Comme mentionné ci-dessous dans les commentaires de elclanrs réponse,
add
est un substitut viable, et j'ai préparé un nouvelle JSFiddle pour démontrer que cela fonctionne. Toutefois, cela n'explique pas pourquoi le comportement affiché sur la doc (et même dans ses commentaires, voir le thread entier contenant les réponses de "MarkAndrewSlade") n'est pas disponible pour leafter
méthode de jQuery objets nouvellement créé, l'élément lors de l'élément a de contenu.
Vous devez vous connecter pour publier un commentaire.
C'était un bug connu de jQuery < 1.9. Voir http://bugs.jquery.com/ticket/8759
En jQuery >= 1.9, le informations suivantes du guide de mise à niveau convient de noter:
Utilisation
add()
pour ajouter des objets de la collection. J'utiliseafter()
plus dans les DOM éléments qui existent déjà ou qui sont mis en cache dans une variable, mais la plupart du temps, si vous travaillez avec dynamique de balisage est plus pratique d'utiliser l'équivalentinsertAfter()
.EDIT:
Cela fonctionne...
add
dans l'avenir. Et je viens de fouettée en place un nouvelle JSFiddle pour démontrer queadd
ne faire ce que vous avez mentionné. Mais cela ne veut pas répondre à ma question, c'est pourquoiafter
ne le fait pas.J'ai trouvé que j'ai encore parfois d'avoir des problèmes avec
.add()
en place de.after()
, donc un autre moyen facile de contourner ce bug est de faire un jeter élément wrapper,.append()
les éléments frères, et l'utilisation.html()
pour obtenir exactement l'intérieur contenu de l'emballage.Exemple:
Cela va ajouter de la
<div>
et<p>
mais jeter l'extérieur<span>
. J'ai trouvé cela fonctionne généralement bien avec.append()
mais peut avoir des problèmes avec.appendTo()
En jQuery 1.12.4, j'ai découvert que l'utilisation d'un sélecteur de classe au lieu d'un sélecteur d'ID résout ce problème.
Si vous êtes aux prises avec
$("#myelement1").after("<p>test</p>")
,ajouter une classe unique à votre élément et essayez ce qui suit:
$(".myelement1").after("<p>test</p>")