2010-10-29 4 views
1

Je veux ajouter du code HTML comme ceci:jQuery: Suppression d'élément HTML tout en gardant des enfants

<div><img src="item.png"/>&nbsp;<a href="#"><span>Hello</span></a></div> 

mais dans certains cas, je besoin de se débarrasser de l'emballage d'un élément, il ressemble à ceci:

<div><img src="item.png"/>&nbsp;<span>Hello</span></div> 

Cet élément a peut être n'importe où dans des fragments HTML arbitraires. Je l'attrape par un [href = "#"]. Ce code HTML ne fait pas partie du DOM, il est ajouté au DOM après la suppression de l'élément a.

Je suis allé à toutes sortes de choses que jQuery propose pour cela, mais je ne l'ai pas fait. Mon principal problème est, qu'il semble y avoir aucun moyen d'appliquer un sélecteur HTML créé par jQuery comme ceci:

$("html code from above"); 

J'ai essayé d'obtenir l'un élément remplaçant par c'est HTML intérieur, mais tout mon constructions avec find() et replaceWith() échouent, la plupart du temps juste le <span>Hello</span> est laissé :(

Comment une jQuery-pro résoudre ce?

+1

Au lieu d'enlever l'ancre, pourquoi ne pas l'ajouter au besoin? –

+0

L'élément a forme la partie cliquable du HTML et comme il est créé par "tiers" je ne saurais pas où le mettre. – user414873

Répondre

0

ce que vous devez faire est de définir le contexte de votre sélecteur. Voir cette référence: http://api.jquery.com/jquery/#selector-context

Dans votre cas, lorsque vous effectuez la sélection pour remplacer le lien, définissez le contexte en tant que fragment HTML que vous modifiez. Voici un exemple:

$(function() { 
    //create snippet 
    var mySnippet = $('<div><img src="item.png"/>&nbsp;<a href="#"><span>Hello</span></a></div>'); 

    //remove the link, using the snippet as the context 
    $('a[href="#"]', mySnippet).replaceWith($('a[href="#"]', mySnippet).html()); 

    //insert the modified snippet 
    $('body').append(mySnippet); 
}); 

Et voici une démo de ce en action (pas très excitant, mais montre que cela fonctionne): http://jsfiddle.net/Ender/dQ32B/

+0

Merci Ender, cela fonctionne très bien. Je n'étais pas au courant de la possibilité de donner un contexte lors de l'utilisation de replaceWith. – user414873

4

Ne serait-pas le unwrap fonction faire ce que vous voulez?

Si vous voulez juste enlever l'étiquette entourant (comme une ancre)

+1

Je voulais juste ajouter que si vous avez du texte dans un élément que vous ne voulez pas déballer, vous devez d'abord chaîner le contenu: $ ('a'). Contents(). Unwrap() – drphrozen

Questions connexes