Sélecteur CSS insensible à la casse pour les attributs

Si j'ai un élément HTML <input type="submit" value="Search" /> un sélecteur css doit être sensible à la casse:

input[value='Search'] correspond

input[value='search'] ne correspond pas

J'ai besoin d'une solution où l'approche insensible à la casse fonctionne aussi. je suis l'aide de Sélénium 2 et Jquery, ainsi que des réponses pour les deux sont les bienvenus.

31
demandé sur BoltClock 2011-04-15 04:35:04

4 réponses

Il existe maintenant en CSS4, voir cette réponse .

Sinon, pour jQuery, vous pouvez utiliser...

$(':input[name]').filter(function() {
   return this.value.toLowerCase() == 'search';
});

JsFiddle.

Vous pouvez également créer un sélecteur personnalisé...

$.expr[':'].valueCaseInsensitive = function(node, stackIndex, properties){
     return node.value.toLowerCase() == properties[3];
};

var searchInputs = $(':input:valueCaseInsensitive("Search")');

JsFiddle.

Le sélecteur personnalisé est un peu exagéré si vous le faites une fois, mais si vous devez l'utiliser plusieurs fois dans votre application, cela peut être une bonne idée.

Mettre à jour

Est-il possible d'avoir ce type de sélecteur personnalisé pour n'importe quel attribut?

Bien sûr, consultez l'exemple suivant. C'est un peu compliqué (la syntaxe telle que :input[value:toLowerCase="search"] a peut-être été plus intuitive), mais ça marche :)

$.expr[':'].attrCaseInsensitive = function(node, stackIndex, properties){
    var args = properties[3].split(',').map(function(arg) {
        return arg.replace(/^\s*["']|["']\s*$/g, '');  
    });
    return $(node).attr(args[0]).toLowerCase() == args[1];
};

var searchInputs = $('input:attrCaseInsensitive(value, "search")');

JsFiddle.

Vous pourriez probablement utiliser eval() pour faire de cette chaîne Un tableau, mais je trouve le faire de cette façon plus confortable (et vous n'exécuterez accidentellement aucun code que vous placez dans votre sélecteur).

Au lieu de cela, je divise la chaîne sur , délimiteur, puis décapage les espaces, ' et ", de chaque côté de chaque membre du groupe. Notez qu'un , à l'intérieur d'une citation ne sera pas traitée littéralement. Il n'y a aucune raison d'être nécessaire littéralement, mais vous pouvez toujours coder contre cette possibilité. Je vais laisser ça à vous. :)

Je ne pense pas map() a le meilleur support du navigateur, de sorte que vous pouvez explicitement itérer sur le tableau args ou augmenter l'objet Array .

30
répondu alex 2018-02-07 19:39:20

Css4 (niveau du sélecteur CSS 4) ajoute le support pour cela:

input[value='search' i]

C'est le "je" à la fin qui fait l'affaire.

Adoption plus large a commencé mi-2016: Chrome (depuis v49), Firefox (à partir de v47?), De l'opéra et quelques autres. IE pas et Edge pas encore. Voir "puis-je utiliser"...

43
répondu Robert Siemer 2017-02-22 11:30:20
input[value='Search'] matches
input[value='search' i] Also matches in latest browsers

Soutien: version: Chrome > = 49.0, Firefox (Gecko) > = 47.0, Safari > = 9

6
répondu ankit 2016-03-17 12:50:52

Vous ne pouvez pas le faire avec des sélecteurs seuls, essayez:

$('input').filter(function() {
    return $(this).attr('value').toLowerCase() == 'search';
});
1
répondu Khez 2011-04-15 00:48:49