web-dev-qa-db-fra.com

jQuery: contient (), mais pour correspondre à une chaîne exacte

Comme indiqué dans le titre, j'aimerais trouver quelque chose comme :contains() mais pour correspondre à une chaîne exacte. En d'autres termes, cela ne devrait pas être une correspondance partielle. Par exemple dans ce cas:

<div id="id">
   <p>John</p>
   <p>Johny</p>
</div>

$("#id:contains('John')") correspondra à la fois John et Johny, alors que j'aimerais ne faire correspondre que John.

Merci d'avance.

EDIT: ES2015 solution monocouche, au cas où quelqu'un le chercherait:

const nodes = [...document.querySelectorAll('#id > *')].filter(node => node.textContent === 'John');

console.log(nodes);
/* Output console formatting */
.as-console-wrapper { top: 0; }
.as-console { height: 100%; }
<div id="id">
  <p>John</p>
  <p>Johny</p>
</div>
25
Przemek

Vous pouvez utiliser filter pour cela:

$('#id').find('*').filter(function() {
    return $(this).text() === 'John';
});

Edit: comme performance, si vous en savez plus sur la nature de ce que vous recherchez (par exemple, que les nœuds sont des enfants immédiats de #id), il serait plus efficace d’utiliser quelque chose comme .children() au lieu de .find('*').


En voici un exemple, si vous voulez le voir en action: http://jsfiddle.net/Akuyq/

34
jmar777

la réponse de jmar777 m'a aidé à résoudre ce problème, mais pour éviter de chercher dans tout ce que j'avais commencé avec le sélecteur: contient et filtrer ses résultats

var $results = $('#id p:contains("John")').filter(function() {
    return $(this).text() === 'John';
});

Voici un violon mis à jour http://jsfiddle.net/Akuyq/34/

7
PaulParton

Vous pouvez essayer d’écrire une expression régulière et d’en faire une recherche: Validation du champ d’expression régulière dans jQuery

0
Steve Sloka

La méthode simple consiste à "sélectionner un élément par correspondance exacte" à l'aide d'une pseudo-fonction.

Solution Sélectionnez un élément en fonction de son contenu

0
Mehmet Hanoğlu