Селектор текстовых атрибутов jQuery - PullRequest
1 голос
/ 17 июня 2010

Я пытаюсь использовать атрибут text в качестве селектора, но я не совсем понимаю поведение, был бы очень признателен, если бы кто-то мог объяснить.Например, данные <span class="span_class"><a class="a_class">text</a></span>, $('a.a_class').text() дают «текст», как и ожидалось.Однако $('a.a_class[text]') не будет соответствовать ни одному из элементов, и ни один не будет $('span.span_class > a.a_class[text]'), но $('span.span_class* > a.a_class[text]') будет (хотя не в IE).Единственный обходной путь, который я могу придумать для IE, - это перебрать все якоря, содержащиеся в span, использовать .text () для каждого и сопоставить его с определенными критериями, но это кажется медленнее, чем использование встроенных селекторов.У кого-нибудь есть идеи получше?

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Как насчет использования пользовательского селектора

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

Синопсис

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

Вы можете даже создать селектор, который обрабатывает регулярные выражения, например

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

Конспект

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

выделит и удалит все интервалы, текст которых начинается с api_

3 голосов
/ 17 июня 2010

Это потому, что «текст» в данном случае не является атрибутом.Это содержимое элемента.

Вы ищете селектор :contains():

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

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

Имейте в виду, что этот селектор будетсоответствовать любой части строки.contains(foo) также будет соответствовать "foo bar".

Если вы хотите точное совпадение всей текстовой строки, вы можете использовать filter()

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

РЕДАКТИРОВАТЬ:

Чтобы найти элементы, содержимое которых начинается со значения, вы можете использовать регулярное выражение внутри filter():

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

РЕДАКТИРОВАТЬ: Обновлено для использования indexOf() вместо регулярных выражений в соответствии с рекомендациями @ Nick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...