Определить, является ли строка допустимым селектором 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) { .... }

, чтобы перейти прямо к делу:

  1. нет, jQuery не имеет метода для проверки допустимости селектора.
  2. jQuery имеет много регулярных выражений для этого, поэтому вы не можете найти один в коде.
  3. вам не нужно писать огромное регулярное выражение для этого, ответ более прост, как показано ниже.

Я понимаю вашу проблему, потому что я ее испытал, есть случаи, когда вы не контролируете селектор, чтобы дать в функции 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