JQuery - Как я могу написать нечувствительный к регистру селектор «Атрибут содержит»? - PullRequest
5 голосов
/ 21 октября 2011

Я пытаюсь написать пользовательский скрипт для YouTube, который будет выбирать все видео на странице на основе их заголовков, которые также задаются в качестве атрибута title миниатюрных изображений.

хорошо, но он чувствителен к регистру:

var videoTitle = "the";

$('img[title*="'+videoTitle+'"]').each(function() {

// stuff here

});

Приведенный выше селектор будет сопоставлять любое видео с "the" в заголовке, но не с "The" или "THE", например.

Я прочитал, что могу как-то использовать .filter(), но я не уверен, как это работает, и я не смог найти пример, который бы подходил моему сценарию.

Я попробовал что-то вродеэто основано на примере, который я нашел в StackOverflow, но он не работает:

$('img[title]').filter(function(){return this.title.toLowerCase() == videoTitle}).each(function() {

// stuff here

});

Ответы [ 5 ]

9 голосов
/ 21 октября 2011

Это адаптировано из сообщения Карла Сведбурга на странице jQuery docs для «Атрибутов содержит селектор». Он использует RegEx и i нечувствительный к регистру переключатель вместе с функцией filter -

<img title="Star Wars"/>
<img title="Star Wars 2"/>
<img title="Star Wars 3"/>
<img title="Back To The Future"/>

var videoTitle = "star wars";
var re =  RegExp(videoTitle ,"i"); 
$('img[title]').filter(function() {
   return re.test(this.title);
}).each(function() {alert(this.title)});

Названия трех фильмов «Звездные войны» должны быть предупреждены.

Демо - http://jsfiddle.net/FKBTx/3

1 голос
/ 21 октября 2011

Пример -

$('img').filter(function(){
    return this.title.match(RegExp(videoTitle ,"i"))
}).each(function(){
        alert(this.title);
})
0 голосов
/ 21 октября 2011

Это должно работать:

var videoTitle = "bla";
$('img').filter(function() {
    return $(this).attr('title').toLowerCase() == videoTitle;
}).each(function() {
    // do something
});
0 голосов
/ 21 октября 2011
$('img').filter(function (index) { return this.title.toLowerCase() === videoTitle; })
0 голосов
/ 21 октября 2011

используя опцию фильтра, просто измените функцию на return this.title.toLowerCase().indexOf(videoTitle) >= 0 в противном случае он соответствует только «», а не тому, что содержит «(»).
РЕДАКТИРОВАТЬ: Кроме того, не уверен, что this.title в порядке, но, возможно, если вышеописанное не работает, попробуйте $ (this) .attr ('title')

...