2010-06-22 6 views
10

Quel serait le meilleur moyen de balayer tous les DOM, trouver un élément qui a du texte et l'envelopper dans une classe d'envergure? ThanxJquery trouver tous les éléments avec du texte

+0

Je pense que vous avez besoin de préciser ce que tu veux dire avec 'n'importe quel élément qui a du texte'. Voulez-vous dire des éléments qui contiennent du texte autre que des espaces blancs, mais pas des éléments enfants? –

Répondre

14

Pour envelopper tous les nœuds de texte qui contiennent autre chose que simplement des espaces:

$('body *').contents().filter(function() { 
    return (this.nodeType == 3) && this.nodeValue.match(/\S/); 
}).wrap("<span />") 

Pour envelopper tous les nœuds de texte, y compris ceux qui ne contiennent que des espaces:

$('body *').contents().filter(function() { 
    return (this.nodeType == 3) && this.nodeValue.length > 0; 
}).wrap("<span />") 
+0

Voir ce code en action à: http://jsbin.com/oquhu3/3 (celui * avec * espace) –

+0

Thanx, ça marche! J'ai essayé d'ajouter une classe mais ça n'a pas marché. $ (function() { $ ('body *'). Contents(). Filter (fonction() { return (this.nodeType == 3) && this.nodeValue.length> 0; }). AddClass ("someclass"); }); Une idée pourquoi? Merci encore. – Mircea

+0

Vous ne pouvez pas ajouter de classe à un nœud de texte. Essayez de l'encapsuler avec un span qui a une classe: $ ('body *'). Contents(). Filter (function() { return (this.nodeType == 3) && this.nodeValue.length> 0; }) .wrap ("

1

Vous pouvez utiliser .each itérer sur tous elememnts:

$('*').each(function(){ 
    if($(this).text()) 
    { 
     $(this).wrapInner('<span />'); 
    } 
}) 

Je n'ai pas testé ce morceau de code, mais il est assez simple. Tout ce que vous devez savoir sur est .chacun, wrapInner et * sélecteur. jQuery docs est assez utile ici.

+0

On dirait qu'il reste du travail: http://jsbin.com/oquhu3 –

+1

essayez d'ajouter $ (document) .ready(); à votre code: $ (document) .ready (function() { $ ('*'). chaque (fonction {} ( if ($ (this) .text()) { $ (this) .wrapInner (''); ) )) }) – dzida

+2

Je pense que cela va ajouter de la classe à tous les éléments HTML, qu'ils aient du texte ou non. – Mircea

Questions connexes