CSS селектор без учета регистра для атрибутов - PullRequest
33 голосов
/ 15 апреля 2011

Если у меня есть элемент HTML <input type="submit" value="Search" />, селектор css должен быть чувствительным к регистру:

input[value='Search'] соответствует

input[value='search'] не соответствует

Мне нужно решение, где подход без учета регистра тоже работает. Я использую Selenium 2 и Jquery , поэтому ответы на оба приветствуются.

Ответы [ 4 ]

47 голосов
/ 03 ноября 2014

CSS4 (уровень селектора CSS 4) добавляет поддержку для него:

input[value='search' i]

Это «i» в конце, который делает трюк.

Более широкое внедрение началось в середине 2016 года: Chrome (начиная с v49), Firefox (с v47?), Opera и некоторые другие имеют его.IE нет, а Edge еще нет.См. «Могу ли я использовать» ...

32 голосов
/ 15 апреля 2011

Теперь он существует в CSS4, см. этот ответ .

В противном случае для jQuery вы можете использовать ...

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

jsFiddle .

Вы также можете сделать пользовательский селектор ...

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

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

jsFiddle .

Пользовательский селектор немного излишнимесли вы делаете это один раз, но если вам нужно использовать его много раз в приложении, это может быть хорошей идеей.

Обновление

Возможно ли иметь такой видселектор для любого атрибута?

Конечно, посмотрите следующий пример.Это немного запутанно (синтаксис, такой как :input[value:toLowerCase="search"], возможно, был более интуитивно понятен), но он работает:)

$.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 .

Возможно, вы могли бы использоватьeval(), чтобы сделать эту строку массивом, но я считаю, что делать это более удобно (и вы не будете случайно выполнять код, который вы поместите в свой селектор).

Вместо этого я разбиваю строку на, разделитель, а затем удаление пробелов, ' и " с каждой стороны каждого элемента массива.Обратите внимание, что , внутри цитаты не будет трактоваться буквально.Нет причин, по которым это нужно делать буквально, но вы всегда можете использовать эту возможность.Я оставлю это на ваше усмотрение.:)

Не думаю, что map() имеет лучшую поддержку браузера, поэтому вы можете явно выполнять итерации по массиву args или увеличивать объект Array .

7 голосов
/ 17 марта 2016
input[value='Search'] matches
input[value='search' i] Also matches in latest browsers

Поддержка: версия: Chrome> = 49.0, Firefox (Gecko)> = 47.0, Safari> = 9

1 голос
/ 15 апреля 2011

Вы не можете сделать это только с помощью селекторов, попробуйте:

$('input').filter(function() {
    return $(this).attr('value').toLowerCase() == 'search';
});
...