Czy istnieje jQuery: zawiera selektor niewrażliwy na wielkość liter?


Odpowiedzi:


125

To, co ostatecznie zrobiłem dla jQuery 1.2, to:

jQuery.extend(
    jQuery.expr[':'], { 
        Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

Spowoduje to rozszerzenie jquery tak, aby zawierał selektor: Zawiera selektor niewrażliwy na wielkość liter, selektor: zawiera niezmieniony.

Edycja: dla jQuery 1.3 (dzięki @ user95227) i później potrzebujesz

jQuery.expr[':'].Contains = function(a,i,m){
     return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

Edycja: najwyraźniej uzyskuje się bezpośredni dostęp do DOM za pomocą

(a.textContent || a.innerText || "") 

zamiast

jQuery(a).text()

W poprzednim wyrażeniu znacznie go przyspiesza, więc jeśli problemem jest szybkość, spróbuj na własne ryzyko. (patrz @John „s pytanie )

Ostatnia edycja: dla jQuery 1.8 powinno to być:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

Chciałem tylko poinformować ludzi, że rozwiązanie opisane przez @Pat i innych dla jQuery 1.3 działa również dla 1.4.3.
Jim Ade

Link do pytania / odpowiedzi
@Johna,

To nie działa dla jQuery 1.8. Zobacz odpowiedź seagullJS poniżej, aby uzyskać zaktualizowaną wersję - stackoverflow.com/a/12113443/560114
Matt Browne

105

Aby opcjonalnie nie rozróżniać wielkości liter: http://bugs.jquery.com/ticket/278

$.extend($.expr[':'], {
  'containsi': function(elem, i, match, array)
  {
    return (elem.textContent || elem.innerText || '').toLowerCase()
    .indexOf((match[3] || "").toLowerCase()) >= 0;
  }
});

następnie użyj :containsizamiast:contains


3
dodanie nowej funkcji jest
lepsze

22
powinno to zostać dodane do standardowej biblioteki jquery
user482594,

41

Od wersji jQuery 1.3 ta metoda jest przestarzała. Aby to zadziałało, musi być zdefiniowane jako funkcja:

jQuery.expr[':'].Contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

38

Jeśli ktoś (taki jak ja) jest zainteresowany, co oznaczają a i m [3] w definicji Zawiera .


KLUCZ / LEGENDA: Parametry udostępnione przez jQuery do użycia w definicjach selektorów:

r = jQuery tablica badanych elementów. (np .: r.length = liczba elementów)

i = indeks aktualnie badanego elementu w tablicy r .

a = element obecnie analizowany. Instrukcja selektora musi zwracać wartość true, aby uwzględnić ją w dopasowanych wynikach.

m [2] = nodeName lub *, którego szukamy (po lewej od dwukropka).

m [3] = parametr przekazany do: selector (param). Zazwyczaj numer indeksu, jak w : nth-of-type (5) , lub ciąg znaków, jak w : color (blue) .


31

W jQuery 1.8 będziesz musiał użyć

jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {                                                                                                                                                                
    return function (elem) {                                                            
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;        
    };                                                                                  
});

2
Działało idealnie, dzięki! Właśnie zaktualizowano do wersji 1.8 i to przestało działać.
Andreas

3
dzięki za aktualizację. Właśnie zaktualizowano do JQuery 1.8 i przestało działać
Wasim

15

Odmiana, która wydaje się działać nieco szybciej i która pozwala również na wyrażenia regularne, to:

jQuery.extend (
    jQuery.expr[':'].containsCI = function (a, i, m) {
        //-- faster than jQuery(a).text()
        var sText   = (a.textContent || a.innerText || "");     
        var zRegExp = new RegExp (m[3], 'i');
        return zRegExp.test (sText);
    }
);



Nie tylko nie jest rozróżniana wielkość liter, ale także umożliwia zaawansowane wyszukiwanie, takie jak:

  • $("p:containsCI('\\bup\\b')") (Dopasowuje „Up” lub „up”, ale nie „Upper”, „Wakeup” itp.)
  • $("p:containsCI('(?:Red|Blue) state')") (Dopasowuje „stan czerwony” lub „stan niebieski”, ale nie „stan włączenia” itp.)
  • $("p:containsCI('^\\s*Stocks?')") (Dopasowuje „stock” lub „stocks”, ale tylko na początku akapitu (ignorując początkowe białe spacje).

11

Może się spóźnić ... ale

Wolałbym iść tą drogą ...

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

W ten sposób NIE modyfikujesz NATIVE '.contains' jQuery ... Domyślny może być potrzebny później ... jeśli ktoś się przy nim manipuluje , możesz wrócić do stackOverFlow ...


6
jQuery.expr[':'].contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

Kod aktualizacji działa świetnie w wersji 1.3, ale słowo „zawiera” powinno być zapisane małą literą na pierwszej literze, w przeciwieństwie do poprzedniego przykładu.


1
Myślę, że chciał mieć odrębną funkcję, aby obie :containsi :Containsdziałały jednocześnie.
joshperry

„selektor: zawiera pozostaje niezmieniony”.
Harry B

4

Zobacz poniżej, aby użyć „: zawiera”, aby znaleźć tekst ignorujący wielkość liter w kodzie HTML,

 $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });
        $("#searchTextBox").keypress(function() {
          if($("#searchTextBox").val().length > 0){
            $(".rows").css("display","none");
            var userSerarchField = $("#searchTextBox").val();
            $(".rows:contains('"+ userSerarchField +"')").css("display","block");
          } else {
            $(".rows").css("display","block");
          }              
        });

Możesz również użyć tego linku, aby znaleźć kod ignorujący wielkość liter na podstawie Twojej wersji jquery, Make jQuery: zawiera bez rozróżniania wielkości liter


2

Szybsza wersja korzystająca z wyrażeń regularnych.

$.expr[':'].icontains = function(el, i, m) { // checks for substring (case insensitive)
    var search = m[3];
    if (!search) return false;

    var pattern = new RegExp(search, 'i');
    return pattern.test($(el).text());
};

Świetna robota! Dziękuję Ci bardzo. Uważam, że to najlepsza i najbardziej aktualna odpowiedź na to pytanie.
mavrosxristoforos

0

Miałem podobny problem z niedziałającymi następującymi ...

// This doesn't catch flac or Flac
$('div.story span.Quality:not(:contains("FLAC"))').css("background-color", 'yellow');

Działa to bez konieczności przedłużania

$('div.story span.Quality:not([data*="flac"])').css("background-color", 'yellow');

To też działa, ale prawdopodobnie należy do kategorii „ręczne zapętlanie” ....

$('div.story span.Quality').contents().filter(function()
{
  return !/flac/i.test(this.nodeValue);
}).parent().css("background-color", 'yellow');

0

Nowa zmienna Nadaję jej nazwę subString i wstawiam ciąg, który chcesz wyszukać w tekście niektórych elementów. Następnie za pomocą selektora Jquery wybierz potrzebne elementy, takie jak mój przykład, $("elementsYouNeed")i filtruj według .filter(). W .filter()będzie porównać każdy element $("elementsYouNeed")z funkcją.

W funkcji używam również .toLowerCase()dla elementu tekstowego subString, który może uniknąć warunku uwzględniającego wielkość liter i sprawdzić, czy jest w nim podstring. Następnie .filter()metoda konstruuje nowy obiekt jQuery z podzbioru pasujących elementów.

Teraz możesz pobrać elementy dopasowania w matchObjects i robić, co chcesz.

var subString ="string you want to match".toLowerCase();

var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.