2010-10-17 4 views
1

Y a-t-il un sélecteur de texte dans jquery?Y a-t-il un sélecteur de texte dans jquery?

Mon code

<anything>Hello World! Hello World!</anything> 

Reslut doit-elle être (à l'aide Jquery)

<anything>Hello <span>World</span>! Hello <span>World</span>!</anything> 
+2

Nope. Les parties de nœuds de texte ne sont pas des éléments DOM valides. –

+3

Vérifiez le plugin [jQuery "highlight"] (http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html) – Pointy

Répondre

1
$('anything').html(function(i, v) { 
    return v.replace(/(World)/g, '<span>$1</span>'); 
}); 

L'extrait ci-dessus utilise la fonctionnalité ajoutée dans jQuery 1.4.

Note: cette solution est sans danger pour les éléments qui ne contiennent que du texte brut (et aucun élément enfant). N ° jQuery travaille principalement avec des éléments et vous donne très peu pour la gestion du texte.

+0

@bobince Bonne prise. Au lieu de text(), la méthode html() doit être utilisée ... Cependant, maintenant nous devons faire attention à ce que l'expression rationnelle ne détruise pas les balises dans la chaîne innerHMTL –

+0

Oui (oups j'ai déplacé le commentaire). Ce qui précède est dangereux car il correspondra heureusement au contenu non-texte. De plus, il n'est pas fiable pour les chaînes en général car le navigateur décide des caractères à échapper au HTML (pas un problème pour les lettres 'World', mais peut être pour d'autres chaînes). De plus, il détruit et recrée tous les éléments contenus, ce qui efface toutes les propriétés non sérialisables, telles que les valeurs de formulaire ou les gestionnaires d'événements. C'est le piratage HTML avec regex, qui pour un élément simple contenant seulement le texte que vous pourriez obtenir, mais tous les problèmes habituels se cachent là. – bobince

+0

J'ai choisi de supprimer ma réponse car tout ce qui peut éventuellement être faux avec elle est faux. – BoltClock

1

Vous pouvez faire un remplacement regex, etc pour votre cas simple, mais pour une réponse plus générale: pas .

jQuery ne vient fournit pas beaucoup d'aide lorsqu'ils traitent avec des nœuds de texte, il est conçu principalement pour traiter les types de nœuds d'élément (nodeType == 1), pas les types de nœuds de texte (nodeType == 3) ... donc oui vous pouvez l'utiliser cela aide (par exemple .contents() et .filter()), mais ce ne sera pas souvent puisque ce n'est pas le but principal de la bibliothèque.

+1

Typo: 'noteType' devrait être' nodeType ' – Day

+0

@Day - oops faute de frappe, merci pour la capture! mis à jour –

2

Pour effectuer une recherche et un remplacement sur du texte, vous devez vérifier chaque nœud de texte séparément et effectuer les opérations DOM splitText afin de le démonter lorsqu'une correspondance est trouvée. Par exemple:

function findText(element, pattern, callback) { 
    for (var childi= element.childNodes.length; childi-->0;) { 
     var child= element.childNodes[childi]; 
     if (child.nodeType==1) { 
      var tag= child.tagName.toLowerCase(); 
      if (tag!=='script' && tag!=='style' && tag!=='textarea') 
       findText(child, pattern, callback); 
     } else if (child.nodeType==3) { 
      var matches= []; 
      var match; 
      while (match= pattern.exec(child.data)) 
       matches.push(match); 
      for (var i= matches.length; i-->0;) 
       callback.call(window, child, matches[i]); 
     } 
    } 
} 

findText(element, /\bWorld\b/g, function(node, match) { 
    var span= document.createElement('span'); 
    node.splitText(match.index+match[0].length); 
    span.appendChild(node.splitText(match.index)); 
    node.parentNode.insertBefore(span, node.nextSibling); 
}); 
+0

Je recommande d'utiliser des blocs dans les instructions composées comme si, pour et pendant. –