[javascript] Gibt es eine Groß-und Kleinschreibung jQuery: Enthält Selektor?


Answers

Um es optional Groß-und Kleinschreibung zu http://bugs.jquery.com/ticket/278 : 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 benutze :containsi statt :contains

Question

Gibt es eine case insensitive Version des :contains jQuery-Selektor oder soll ich die Arbeit manuell tun, indem ich alle Elemente durchlaufen und ihre .text () mit meiner Zeichenfolge vergleichen?




Ich hatte ein ähnliches Problem mit dem 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');

Das funktioniert auch, fällt aber wahrscheinlich in die Kategorie "manuell looping" ....

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



Wenn jemand (wie ich) interessiert ist, was a und m [3] in Definition von Contains bedeuten.

KEY / LEGEND: Params, die von jQuery zur Verwendung in den Selektor-Definitionen zur Verfügung gestellt werden:

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

i = Index des aktuell untersuchten Elementes innerhalb des Arrays r .

a = Element, das derzeit geprüft wird. 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] = param wurde in den: selector (param) übergeben. In der Regel eine Indexnummer wie in : nth-of-type (5) oder eine Zeichenfolge wie in : color (blue) .




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" sollte Kleinbuchstaben auf den ersten Buchstaben im Gegensatz zum vorherigen Beispiel sein.




Eine Variante, die etwas schneller zu sein scheint und die auch reguläre Ausdrücke erlaubt, 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);
    }
);


Dies ist nicht nur die Groß- / Kleinschreibung, sondern ermöglicht auch leistungsstarke Suchanfragen wie:

  • $("p:containsCI('\\bup\\b')") ( $("p:containsCI('\\bup\\b')") "Up" oder "Up", aber nicht "Upper", "Wakeup", etc.)
  • $("p:containsCI('(?:Red|Blue) state')") (Entspricht "Rot-Zustand" oder "Blau-Zustand", aber nicht "Up-Zustand", etc.)
  • $("p:containsCI('^\\s*Stocks?')") (Entspricht "stock" oder "stocks", aber nur am Anfang des Absatzes (wobei führende Leerzeichen ignoriert werden).)



Links