2013-03-21 2 views
2

Я пытаюсь добавить событие click на вкладку, созданную виджетами Telerik ASP.NET. Я поднял надрез сгенерированного HTML в статические страницы для целей эксперимента:Синтаксис синтаксиса jQuery для значения innerText

<HTML> 
<HEAD> 
<TITLE>sandpit</TITLE> 
<SCRIPT TYPE="text/javascript" SRC="jquery-1.9.1.js"></SCRIPT> 
<SCRIPT> 
$(document).ready(function(){ 
    var foo = $("span.rtsTxt"); 
    var bar = foo.filter("[innerText='More']") 
    bar.on('click',function(){alert('click');}); 
    alert('ready'); 
}); 
</SCRIPT> 
</HEAD> 
<BODY> 
    <ul> 
    <li class="rtsLI"> 
     <a class="rtsLink rtsAfter"> 
     <span class="rtsOut"> 
      <span class="rtsIn"> 
      <span class="rtsTxt">Preferences</span> 
      </span> 
     </span> 
     </a> 
    </li> 
    <li class="rtsLI"> 
     <a class="rtsLink rtsAfter"> 
     <span class="rtsOut"> 
      <span class="rtsIn"> 
      <span class="rtsTxt">More</span> 
      </span> 
     </span> 
     </a> 
    </li> 
    </ul> 
</BODY> 
</HTML> 

Отладка показывает, что Foo содержит два элемента, как и ожидалось. Однако я не могу понять синтаксис для выбранного второго, где значение innerText - «Больше».

Вопрос в том, как выразить innerText == 'More' либо в выражении фильтра, как показано, либо непосредственно в строке селектора?

ответ

4

Попробуйте :contains selector:

var bar = foo.filter(":contains('More')") 

Вот jsfiddle demo показывая его работу.

ПРЕДУПРЕЖДЕНИЕ: Хотя это будет работать на HTML в вопросе, селектор :contains будет соответствовать любой элемент, содержащий заданный текст, а не только элемент, текст равен данный текст. (Как пояснил @RAS в комментарии ниже.)

+0

не то же самое, как если бы Равно. – RAS

+0

То, о чем я тоже думал, но мое решение не попадает в гвоздь на вопрос, так как он хочет его в селекторе ... –

+0

@RAS - Вы правы, это буквально означает, содержит, а не равно. Это может быть достаточно в зависимости от случая. –

1

Не может быть этого?

if ($("span.rtsTxt").html() == "More") { 
    // do stuff 
} 
+0

Это не хорошо, потому что элемент может содержать некоторые другие элементы. Хотя это частично правильно, поэтому я не буду спускать вниз. – poxip

6

еще один подход, чтобы выбрать элемент, который будет возвращать объект является использование filter как это:

$(".rtsTxt").filter(function() { 
    return $(this).text() == "More"; 
}); 

fiddle

+0

+1 - Я собирался предложить что-то подобное (хотя я не говорю, что знал, что «фильтр» поддерживает обратный вызов, подобный этому), но затем он выбрал мой ответ. –

+0

Я согласен, что это лучший ответ. Я действительно знал, просто прочитав его в документах, что вы можете передать функцию, но значимость этого была потеряна для меня. Применение $() к * this * является умным и, я думаю, будет очень полезным для меня. Но ты дал первый полезный ответ, Джон. В контролируемой среде фактической проблемы, с которой я столкнулся, свободный матч не был проблемой. –

0
jQuery.expr[":"].text = jQuery.expr.createPseudo(function(arg) 
{ 
    return function(elem) { 
     return jQuery(elem).text().toLowerCase() == arg; 
    }; 
}); 
$("span.rtsTxt:text('More')") 

возвращение только элементы, в которых внутренний текст равен «More» Содержит

Смежные вопросы