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.
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';
});
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")');
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")');
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
.
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"...
input[value='Search'] matches
input[value='search' i] Also matches in latest browsers
Soutien: version: Chrome > = 49.0, Firefox (Gecko) > = 47.0, Safari > = 9
Vous ne pouvez pas le faire avec des sélecteurs seuls, essayez:
$('input').filter(function() {
return $(this).attr('value').toLowerCase() == 'search';
});