Czy selektor jQuery: contains jest niewrażliwy na wielkość liter?

Czy istnieje niewrażliwa na wielkość liter wersja selektora :contains jQuery, czy powinienem wykonać pracę ręcznie przez zapętlenie wszystkich elementów i porównanie ich .text() to my string?

Author: BoltClock, 2008-10-09

11 answers

To co zrobiłem dla jQuery 1.2 to:

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

To rozszerzy jquery o selektor: Contains, który jest niewrażliwy na wielkość liter, selektor: contains pozostaje bez zmian.

Edit: 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;
};

Edytuj: Widocznie dostęp do DOM bezpośrednio za pomocą

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

Zamiast

jQuery(a).text()

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

Najnowsza edycja: dla jQuery 1.8 powinna być:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});
 118
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:35

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 :containsi zamiast :contains

 99
Author: montrealmike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 16:54:06

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

jQuery.expr[':'].Contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
 39
Author: user95227,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-23 22:49:50

Jeśli ktoś (tak jak ja) jest zainteresowany co oznaczają A i m[3] w zawiera definicję.


KEY / LEGEND: Params udostępniony przez jQuery do użycia w definicjach selektora:

r = jQuery tablica analizowanych elementów. (np: R. długość = Liczba elementów)

i = indeks elementu aktualnie badanego, w tablicy r .

A = element aktualnie pod Kontrola. Instrukcja selektora musi zwracać true, aby uwzględnić ją w dopasowanych wynikach.

m [2] = nodeName or * that we A looking for (left of colon).

m[3] = param Zazwyczaj numer indeksu, jak w :nth-of-type(5), lub łańcuch znaków, jak w :color(blue).

 35
Author: Alexander Prokofyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-10 05:06:30

W jQuery 1.8 musisz użyć

jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {                                                                                                                                                                
    return function (elem) {                                                            
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;        
    };                                                                                  
});
 29
Author: seagullJS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-24 16:40:39

Odmianą, która wydaje się działać nieco szybciej, a także pozwala wyrażeniom regularnym jest:

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 jest to niewrażliwe na wielkość liter, ale pozwala na potężne wyszukiwania takie jak:

  • $("p:containsCI('\\bup\\b')") (Pasuje Do "Up" lub "up", ale nie "upper"," wakeup " itp.)
  • $("p:containsCI('(?:Red|Blue) state')") (pasuje do "red state" lub "blue state", ale nie "up state" itp.)
  • $("p:containsCI('^\\s*Stocks?')") (Pasuje do "stock "lub " Stock", ale tylko na początku akapitu (ignorując wszystkie wiodące białe znaki).)
 15
Author: Brock Adams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-04 09:26:18

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

Wolałbym iść tędy..
$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

W ten sposób, NIE majstrować z natywnym jQuery '.zawiera"... Możesz potrzebować domyślnego później...jeśli majstrowałeś, możesz wrócić do stackOverFlow...

 10
Author: ErickBest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 16:05:57
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 "contains" powinno być małe litery na pierwszej literze, w przeciwieństwie do poprzedniego przykładu.

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 01:20:02

Użyj poniższego kodu, aby użyć ": contains", 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 użyć tego linku, aby znaleźć więcej na ten temat, Użyj jQuery, aby wyszukać tekst HTML i odpowiednio pokazać lub ukryć

Możesz również użyć tego linku, aby znaleźć case igonring kod na podstawie wersji jquery, Make jQuery: contains Case-Insensitive

 4
Author: Umesh Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 12:52:32

Miałem podobny problem z poniższym nie działa...

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

To działa i bez potrzeby rozszerzenia

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

To również 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
Author: shao.lo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-03 23:09:00

Szybsza wersja z użyciem 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());
};
 0
Author: rotaercz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 16:29:32