2010-10-03 5 views
2

Je dois récupérer des données du DOM, mais les conteneurs n'ont pas de class ou id, et parfois ils ne sont pas tous disponibles.Sélecteur basé sur le texte entre les balises, dans Jquery

Je pouvais trouver ceci:

<h2>name</h2> 
<p>john</p> 
<h2>address</h2> 
<p>street 1</p> 
<h3>email</h3> 
<p>[email protected]</p> 

ou ceci:

<h2>name</h2> 
<p>john</p> 
<h3>email</h3> 
<p>[email protected]</p> 

Comme vous pouvez le voir, pour aller chercher l'e-mail que je ne peux pas sélectionner par class ou id, ni par n (th), car il pourrait être le 2ème ou le 3ème <p>

La seule solution que je vois est d'obtenir le premier <p> juste après <h3>email</h3>, mais je n'ai aucune idée comment filtrer par text() données.

Merci.

+0

Merci pour le (très rapide) réponses, ne savais pas que j'avais tellement d'options dans ce Cas. Je vais avoir besoin de ce sélecteur dans de nombreux contextes, donc le sélecteur personnalisé sera le plus utile. – Omiod

Répondre

6

Vous pouvez toujours créer votre propre sélecteur correspondant sur le contenu du texte exact.

Celui-ci fait cela, mais supprime tout espace d'abord.

$.extend($.expr[':'], { 
    textIs: function(elem, i, attr) { 
     return ($.trim($.text([elem])) === attr[3]); 
    } 
}); 

Ensuite, vous l'utiliser comme ceci:

Exemple:http://jsfiddle.net/aXvm3/

$('h3:textIs(email)').next() 
+0

Pourquoi couper? :) Ne serait-il pas plus utilisable pour les cas ': textIs (email)'? –

+1

@Nick - Pourrait aller dans les deux cas. Vous avez un saut de ligne à l'intérieur de l'étiquette, et soudainement cela ne fonctionne pas. Je suppose qu'il serait moins fréquent qu'un utilisateur veuille faire correspondre un espace blanc avant et arrière en plus du texte. – user113716

2
var yourP = $('h3:contains("email")').next() 
5

Utilisez :contains() ... ou une correspondance exacte avec .filter() puis faire .next() pour obtenir le frère <p> qui suit, comme ceci:

$("h3:contains('email')").next().doSomething(); 

Ou avec .filter() une correspondance exacte (où :contains() est une correspondance de sous-chaîne), comme ceci:

$("h3").filter(function() { return $.text([this]) == "email"; }).next() 

You can test both here.

3

Pour obtenir l'e-mail, par exemple, vous pouvez le faire:

var emailAddress = $('h3:contains(email)').next('p').text(); 
Questions connexes