Запись jQuery selector без учета регистра версии

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

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

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

3 ответов


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

$.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 элементы которого начинается с R или r (так что это будет соответствовать RADIO, radio, RESET или reset). Это довольно глупый пример, но он должен делать то, что вам нужно.


Re комментарий, что функция трудно поймите, я вам немного объясню.

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

Return если оба они истинны:

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

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


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

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");

есть небольшая проблема при использовании ответа lonesomeday.

чтобы воспроизвести ошибку, попробуйте эту: 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)
};