2008-10-09 6 views

Antwort

116

Was ich tun 1.2 für jQuery gelandet ist:

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

Diese jquery verlängern wird eine haben: Enthält Selektor, der Groß- und Kleinschreibung ist, die: enthält Selektor unverändert bleibt.

Edit: Für jQuery 1.3 (Danke @ user95227) und später müssen Sie

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

Edit: Zugriff Scheinbar das DOM direkt über

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

statt

jQuery(a).text() 

Im vorherigen Ausdruck beschleunigt es erheblich, also versuchen Sie auf eigene Gefahr wenn Geschwindigkeit ein Problem ist. (Siehe @John ‚s question)

Neueste edit: Für jQuery 1.8 sollte es sein:

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

Ich wollte nur wissen lassen, dass die von @Pat und anderen für jQuery 1.3 beschriebene Lösung auch für 1.4.3 funktioniert. –

+0

Link zu @ Johns Frage/Antwort, da der Link hier gelöscht wurde: http://stackoverflow.com/questions/1407434/is-there-any-way-to-speed-up-this-solution-for-a-case -insensitive-jquery-contai – Mottie

+0

Dies funktioniert nicht für jQuery 1.8. Siehe seagullJS Antwort unten für eine aktualisierte Version - http://Stackoverflow.com/a/12113443/560114 –

34

Wenn jemand (wie ich) interessiert ist, was einen und m [3] bedeutet in Enthält Definition.


KEY/Legende: Param in den Selektor Definitionen von jQuery zur Verwendung zur Verfügung gestellt:

r = jQuery Array von Elementen geprüft wird. (Beispiel: r.length = Anzahl der Elemente)

i = Index des Elements zur Zeit unter die Lupe genommen, innerhalb des Arrays r.

ein = Element derzeit in Prüfung. Die Selector-Anweisung muss true zurückgeben, um sie in die übereinstimmenden Ergebnisse aufzunehmen.

m [2] = knotenName oder * nach dem wir suchen (links vom Doppelpunkt).

m [3] = Parameter übergeben in: Selektor (param). In der Regel eine Indexnummer, wie in : nth-of-type (5), oder eine Zeichenfolge, wie in : Farbe (blau).

39

Ab jQuery 1.3 ist diese Methode veraltet.Um dies zu erhalten, es zu arbeiten, muss als eine Funktion definiert werden:

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

Der Update-Code funktioniert gut in 1.3, aber „enthält“ soll niedriger Fall sein, auf den ersten Buchstaben im Gegensatz zu dem vorherigen Beispiel.

+1

Ich denke, er wollte eine eigene Funktion, so dass sowohl ': contains' und': Contains' beide gleichzeitig arbeiten. – joshperry

+0

"der: enthält Selektor bleibt unverändert." –

94

Um es optional Fall unempfindlich zu machen: 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; 
    } 
}); 

dann :containsi anstelle von :contains

+3

Hinzufügen einer neuen Funktion ist am besten als überschreiben für mich, ich benutze jetzt diese Option (funktioniert wie ein Charme) –

+20

Dies sollte der Standard jquery Bibliothek hinzugefügt werden – user482594

15

Eine Variante, die etwas schneller auszuführen scheint und das erlaubt auch reguläre Ausdrücke ist:

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); 
    } 
); 



ist nicht nur die Groß- und Kleinschreibung, aber es ermöglicht eine leistungsstarken Suchanfrage wie:

  • $("p:containsCI('\\bup\\b')") (Spiele "Up" oder "nach oben", aber nicht "oberem", "Wake-up", etc.)
  • $("p:containsCI('(?:Red|Blue) state')") (Spiele "red state" oder "blue state", aber nicht "Zustand", etc.)
  • $("p:containsCI('^\\s*Stocks?')") (Spiele "Lager" oder "Aktien", aber nur zu Beginn der Absatz (Ignorieren eines führenden Leerzeichen).)
28

In jQuery 1.8 Sie

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

Arbeitete perfekt, danke! Nur auf 1.8 aktualisiert und das funktioniert nicht mehr. – Andreas

+2

Danke für das Update. Nur auf JQuery 1.8 aktualisiert und es funktioniert nicht mehr – Wasim

9

sein kann spät verwenden müssen .... aber,

Ich würde es vorziehen, diesen Weg zu gehen ..

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

Auf diese Weise, Sie NICHT manipulieren mit jQuery NATIVE '.contains' ... Sie benötigen möglicherweise die Standardeinstellung später ... manipuliert, wenn sie mit, könnten Sie sich zurück in Stackoverflow finden ...

4

Verwenden Sie den folgenden Code zu verwenden „: enthält“ Text finden die Groß- und Kleinschreibung von einem HTML-Code zu ignorieren,

$.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"); 
      }    
     }); 

Sie diesen Link nutzen könnten mehr dazu zu finden, Use jQuery to search HTML text and show or hide accordingly

Sie auch diesen Link Code finden Fall können igonring auf der Grundlage Ihrer jquery Version, Make jQuery :contains Case-Insensitive

0

Ich hatte ein ähnliches Problem mit den folgenden nicht funktioniert ...

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

Dies funktioniert und ohne die Notwendigkeit einer Erweiterung

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

Dies funktioniert auch, aber wahrscheinlich fällt in die "manuell Looping" Kategorie ....

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