2009-06-29 8 views
2

J'ai la structure HTML suivant d'être renvoyé d'une requête AJAX ...jQuery Html Manipulation Question

<th scope="col" style="yada,yada,yada"> 
<a href="javascript:funcName();" style="yada,yada,yada"> 
Test<br />Heading</a></th> 
<th scope="col" style="yada,yada,yada"> 
<a href="javascript:funcName2();" style="yada,yada,yada"> 
Test<br />Heading2</a></th> 

Et je veux manipuler ceci de sorte que le résultat final est ...

<th>Test<br />Heading</th> 
<th>Test<br />Heading2</th> 

Je veux essentiellement supprimer les styles en ligne, et extraire le texte de l'hyperlien. Comment puis-je le faire facilement avec jQuery?

Répondre

4

En supposant $data est la structure DOM ci-dessus ... analysable

$data.find('th').each(function() { 
    $(this).removeAttr('scope').removeAttr('style').html(
     $(this).find('a').html() 
    ); 
}).appendTo(selector); 
+1

Ne devient pas beaucoup plus facile que ça !! Fantastique, merci. –

+1

Une chose à ajouter. Pour ce que ça vaut, je n'avais pas besoin de le mettre dans une variable. J'ai eu un var comme ceci: var tbl = $ (xhr.responseText) et tout ce que j'avais à faire était d'utiliser votre code pour l'appeler comme ceci: tbl.find ('th'). Each (function() {etc .. .}) et plus tard, je viens d'ajouter tbl à un élément et cela a bien fonctionné. –

+0

Hmmm. Je suppose que j'ai toujours supposé que toutes les méthodes internes sont immuables (d'où le paradigme du «chaînage»). –

0

Il semble que l'approche la plus simple serait de choisir le texte et l'utiliser ensuite pour créer de nouveaux éléments de TH, qui peut facilement être fait en jQuery. En supposant que vos données sont dans une donnée variable nommée, vous voulez faire quelque chose comme:

var newTH = ''; // To store as you go 
$("th a", data).each(function(){ // Loop over all anchors in THs 
    newTH += "<th>" + $(this).html() + "</th>"; // Pull out the innerHTML of the anchor, wrap in TH 
}); 

La variable NEWTH serait maintenant un morceau de code HTML que vous pouvez utiliser jQuery pour ajouter dans votre table de.

Je conseillerais de le constituer comme une ficelle d'abord, simplement pour la vitesse. Manipuler et modifier les éléments DOM fonctionne, mais en fonction du nombre de TH que vous obtenez, cela devrait théoriquement être un peu plus rapide.

+1

Je serais choqué si l'ajout de chaînes comme vous le faites est en fait plus rapide pour les grands ensembles de données, ce qui est la seule situation où la vitesse serait pertinente. –

+0

Je me base sur cette information tirée de http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly - qui semble être plutôt fiable et reproductible. :) En outre, la vitesse peut ne pas être totalement pertinente dans ce cas, mais cela ne fait jamais mal de faire les choses correctement la première fois. :) –

+0

La raison pour laquelle les premiers exemples sont lents sur cette page est parce qu'elle appelle append sur chaque itération, ce qui n'est pas la bonne chose à faire - mon exemple n'a jamais fait ça. Comme vous pouvez le voir, cela va plus loin: les chaînes ne sont pas les meilleures pour cela, mais il est préférable de tout mettre dans un tableau et de l'ajouter une fois à la fin. Dans cette situation, cela n'a pas d'importance car au lieu de créer des éléments plus chers, nous modifions simplement quelque chose qui existe déjà. –