Написание jQuery-селектора без учета регистра - PullRequest
6 голосов
/ 19 октября 2010

Я использую следующую строку и хотел бы сделать ее без учета регистра:

var matches = $(this).find('div > span > div#id_to_find[attributeName ^= "filter"]');
if (matches.length > 0) {
}

Мой вопрос заключается в том, как сделать селектор ^= без учета регистра?Может быть, изменив фильтр, а затем несколько регулярных выражений?

Ответы [ 3 ]

9 голосов
/ 19 октября 2010

Чтобы сделать выбор атрибутов без учета регистра, вам нужно написать пользовательскую функцию селектора.

$.expr[':'].iAttrStart = function(obj, params, meta, stack) {
    var opts = meta[3].match(/(.*)\s*,\s*(.*)/);
    return (opts[1] in obj) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0);
};

Вы можете использовать это следующим образом:

$('input:iAttrStart(type, r)')

Это будет соответствовать любомуinput элементов, чей атрибут type начинается с R или r (поэтому он будет соответствовать RADIO, radio, RESET или reset).Это довольно глупый пример, но он должен делать то, что вам нужно.


Замечание о том, что функцию сложно понять, я объясню немного.

$.expr[':'].iAttrStart = function(obj, params, meta, stack) {

Это стандартная подпись для создания пользовательских селекторов.

var opts = meta[3].match(/(.*)\s*,\s*(.*)/);

meta - это массив сведений о вызове.meta[3] - строка, переданная в качестве параметра.В моем примере это type, r.Регулярное выражение соответствует type и r по отдельности.

return (opts[1] in obj) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0);

Возвращает, если оба они верны:

  1. Запрошенный атрибут существует для этого объекта (opts[1] in obj)
  2. Поисковый термин (изменен на нижний регистр) находится в самом начале значения атрибута элемента, также изменен на нижний регистр.

Я мог бы сделать это проще для чтенияиспользуя синтаксис jQuery, а не собственный синтаксис JS, но это означало бы снижение производительности.

2 голосов
/ 19 октября 2010

Здесь вы можете увидеть:

http://www.ericmmartin.com/creating-a-custom-jquery-selector/

Что вам нужно сделать, это создать собственный селектор jquery:

jQuery.extend(jQuery.expr[':'], {
    exactIgnoreCase: "(a.textContent||a.innerText||jQuery(a).text()||'').toLowerCase() == (m[3]).toLowerCase()"
});

И затем просто использовать его:

$("#detail select.fields option:exactIgnoreCase(" + q.val() + "):first");
0 голосов
/ 22 мая 2011

При использовании ответа одинокого дня есть небольшая проблема.

Чтобы воспроизвести ошибку, попробуйте это: HTML-тег на странице - это обычный метатег Facebook:

<meta content="Title of og tag" property="og:title" />

Селектор:

$('meta:attrCaseInsensitive(property, og:site_name)')

Это не будет работать. Причина в том, что когда код селектора попадает в оператор (opts[1] in obj) он выполнит ("property" in obj), который возвращает false. (Не знаю почему)

Чтобы исправить эту проблему, я просто изменил последнюю строку, чтобы использовать метод attr () в jQuery

$.expr[':'].iAttrStart = function(obj, params, meta, stack) {
    var opts = meta[3].match(/(.*)\s*,\s*(.*)/);
    return (undefined != $(obj).attr(opts[1])) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0)
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...