2010-06-17 3 views
1

J'essaie d'utiliser l'attribut de texte comme un sélecteur, mais je ne peux pas tout à fait saisir le comportement, apprécierait vraiment si quelqu'un pouvait expliquer. Par exemple donné <span class="span_class"><a class="a_class">text</a></span>, $('a.a_class').text() donne "texte" comme prévu. Cependant $('a.a_class[text]') ne correspondrait à aucun élément, et $('span.span_class > a.a_class[text]') non plus, mais $('span.span_class* > a.a_class[text]') le ferait (mais pas dans IE). La seule solution envisageable pour IE consiste à parcourir toutes les ancres contenues dans un span, utilisez .text() sur chacun d'entre eux et faites-le correspondre à certains critères, mais il semble plus lent que d'utiliser des sélecteurs intégrés. Quelqu'un a de meilleures idées?jQuery Sélecteur d'attribut de texte

Répondre

3

ce que sur l'utilisation d'un sélecteur personnalisé

$(document).ready(function(){ 
    $.extend($.expr[':'], { 
    notext: function(elem, i, attr){ 
     return($(elem).text() === ""); 
    } 
    });   
}); 

Synopsis

$('span:notext').remove(); 

vous pouvez même créer un sélecteur qui gère les expressions régulières comme

$.extend($.expr[':'], { 
    'content': function(elem, i, attr){  
    return(RegExp(attr[3]).test($(elem).text())); 
    } 
}); 

Synopsis

$('span:content(^api_)').remove(); 

choisirait et supprimer toutes les travées dont le texte commence par api_

+0

Pas besoin d'un wrapper 'document.ready' :) –

+1

Je laisserai le même commentaire ici: A moins que vous * ayez besoin * d'une expression régulière, utilisez' .indexOf() ', c'est * beaucoup * plus rapide, et Lorsque vous parlez de sélecteurs, en particulier sur un nombre potentiellement important d'éléments, la vitesse est importante. –

+0

Parfait, exactement ce que je cherchais :). Merci. – Shagglez

3

Ceci est dû au fait que 'texte' dans ce cas n'est pas un attribut. C'est le contenu de l'élément.

Vous cherchez le sélecteur :contains():

$('a.a_class:contains(text)'); 

http://api.jquery.com/contains-selector/

Gardez à l'esprit que ce sélecteur correspondra à une partie de la chaîne. contains(foo) correspondra également à "foo bar".

Si vous voulez une correspondance exacte de la chaîne entière de texte, vous pouvez utiliser filter()

$('a.a_class').filter(function() { 
    return $(this).text() == "text"; 
}); 

EDIT:

Pour trouver des éléments dont le contenu commence par une valeur, vous pourriez utiliser une expression régulière à l'intérieur du filter():

$('a.a_class').filter(function() { 
    return $(this).text().indexOf("tex") >= 0; 
}); 

EDIT: Mis à jour pour utiliser indexOf() au lieu de regex comme recommandé par @Nick.

+0

Hmm ok. Ce que je cherchais, c'était "Commence par" alors, et '$ ('span.span_class *> a.a_class [texte^=" tex "]')' fonctionnait bien, jusqu'à ce que je l'ai testé avec IE. – Shagglez

+0

@Shagglez - Je ne savais pas que ça marcherait du tout. Je suppose que j'utiliserais l'option 'filter()' avec regex pour savoir si le texte commence par "tex". – user113716

+0

@Shagglez - Vous pouvez utiliser ce que @patrick a, il suffit de remplacer 'return $ (this) .text() ==" text ";' par 'return $ (this) .text(). IndexOf (" text ") = == 0; 'pour un" début-avec "vérifier. –