Определить, является ли строка допустимым селектором jQuery?
есть ли у jQuery метод для определения, является ли аргумент, переданный функции, селектором?
Я делаю шаблон для некоторых плагинов jQuery, и мне нужно иметь возможность проверить, является ли переданный аргумент селектором jQuery. Я хочу разрешить другие типы данных и выполнять различные методы на основе того, какой тип данных передается. Обнаружение типов данных легко, но селекторы являются просто строкой и могут быть построены по-разному.
моя цель-создать плагины, которые прощают то, что вы передаете для Аргументов и принимают обоснованные решения о том, что с ним делать. Возьмите Плагины jQuery UI, например, в некоторых плагинах, скажем, мы передаем функцию обратного вызова в держателе места аргумента, который для числа для скорости, он все еще принимает обратный вызов и запускает его и использует значение по умолчанию для скорости. Это та функциональность, которую я собираюсь, и селекторы-довольно уникальный случай.
jQuery написал регулярное выражение для этого? Я не мог найти в Кодексе.
Если нет, я думаю, мне просто нужно написать огромное регулярное выражение для этого?
5 ответов
много строк технически быть селектором, как $('blah')
можно выбрать пользовательские элементы! Нет никакого хорошего способа узнать намерение что делать с аргументом, переданным вашей функции, поэтому лучше иметь четко определенную структуру, как прокомментировала Габи.
селектор:
yourFunction({ selector: 'div' });
или
yourFunction({ value: 'testing' });
будет принимать другой маршрут в вашем коде.
без этой техники вы можете сделать это просто попытка для jQuery найти элементы на основе селектора, проверьте с помощью .length
, если элементы найдены, предположим, что вызывающий объект имел в виду селектор jQuery. Другой вариант может быть только документ, что объект jQuery должен быть передан, т. е.:
yourFunction({ value: jQuery('div') });
тогда для другого маршрута вы можете сделать
if (value instanceof of jQuery) { .... }
, чтобы перейти прямо к делу:
- нет, jQuery не имеет метода для проверки допустимости селектора.
- jQuery имеет много регулярных выражений для этого, поэтому вы не можете найти один в коде.
- вам не нужно писать огромное регулярное выражение для этого, ответ более прост, как показано ниже.
Я понимаю вашу проблему, потому что я ее испытал, есть случаи, когда вы не контролируете селектор, чтобы дать в функции jQuery.
проблема недостаточно изложена в том, что если селектор недействителен jQuery выдает ошибку (это важно, потому что вот это ответ).
пример использования jQuery v1.9.1:
$('##somewhere');
он входит в консоль в следующей строке:
throw new Error( "Syntax error, unrecognized expression: " + msg );
какой источник находится в строке 4421 jQuery.JS файл (не сжатый и несжатый вариант).
Итак, вместо того, чтобы искать внутренний метод jQuery (что, безусловно, может упростить вещи, но недоступно), вы можете просто прослушать ошибку, вызванную, чтобы установить, действителен ли селектор:
function isValidSelector(selector) {
if (typeof(selector) !== 'string') {
return false;
}
try {
var $element = $(selector);
} catch(error) {
return false;
}
return true;
}
вы также можете сделать его плагином jQuery:
jQuery.extend({
isValidSelector: function(selector) {
if (typeof(selector) !== 'string') {
return false;
}
try {
var $element = $(selector);
} catch(error) {
return false;
}
return true;
}
});
для использования таким образом:
alert($.isValidSelector('#what?!?'));
С наилучшими пожеланиями.
EDIT:
добавлена проверка типа: селектор должен быть строкой.
Во всяком случае, это частичное решение, оно не возвращает false для селекторов, определенных как строковые объекты var selector = new String('#@wrong-selector#!');
, которым не являются примитивным типом.
для этого не может быть регулярного выражения, так как селекторы расширяемы, и любой может добавить любое количество персональный селекторы (с пользовательскими символами и т. д.) ...
Возможно, вам следует попробовать передать свои аргументы как один объект с именованными параметрами.
{ selector:'...',
otherargument:'somevalue',
afunction: function(){...}
}
код jQuery для определения селектора действителен составляет около 108 строк, поэтому не ожидайте определить, является ли он действительным селектором или нет в одном операторе RegEx.
лучше всего, вероятно, посмотреть, что jQuery определяет как допустимый селектор, и сделать функцию, которая по существу проверяет то же самое, но возвращает, является ли она допустимой или нет.
https://github.com/jquery/jquery/blob/master/src/core.js#L80-188
Это не ответ на ваш вопрос, но я думаю, что это может быть полезным. Он не проверяет, является ли аргумент селектором jQuery, однако проверяет, существует ли селектор в документе.
$.fn.inDom = function() { return $(document).find(this).length; };
кстати: я не использую $(selector).length
непосредственно, так как он вернется 1
Если переданный аргумент является HTMLNode
.
для лучшего толкования:
$('foo').length // 0
$('.foo').length // 0
$('#foo').length // 0
$('<foo>').length // 1
$(document).find('foo').length // 0
$(document).find('.foo').length // 0
$(document).find('#foo').length // 0
$(document).find('<foo>').length // 0