Запись 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 если оба они истинны:
- запрошенный атрибут существует на этом объекте (
opts[1] in obj
) - поисковый запрос (изменен на нижний регистр) находится в самом начале значения атрибута элемента,также измененного на нижний регистр.
Я мог бы сделать это проще для чтения с помощью синтаксиса 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)
};