Определить, является ли строка допустимым селектором jQuery? - PullRequest
9 голосов
/ 08 июня 2011

Есть ли у jQuery метод для определения, является ли аргумент, переданный функции, селектором?

Я делаю шаблон для некоторых плагинов jQuery, и мне нужно иметь возможность проверить, является ли переданный аргументJQuery селектор.Я хочу разрешить другие типы данных и выполнять различные методы в зависимости от того, какой тип данных передается.Обнаружение типов данных легко, но селекторы - это просто строка, и их можно создавать множеством разных способов.

Моя цель - создать плагины, которые прощают то, что вы передаете для аргументов, и принимают обоснованные решения о том, чтоделать с этим.Возьмем, к примеру, плагины пользовательского интерфейса jQuery. В некоторых плагинах, допустим, мы передаем функцию обратного вызова в заполнитель аргумента для числа для скорости, он все еще принимает обратный вызов и запускает его, а для скорости использует значение по умолчанию.Именно такую ​​функциональность я и использую, а селекторы - довольно уникальный случай.

Написал ли для этого jQuery Regex?Я не смог найти ни одного в коде.

Если нет, я думаю, мне просто нужно написать огромное Regex для этого?

Ответы [ 5 ]

30 голосов
/ 03 июня 2013

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

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

Я понимаю вашу проблему, потому что я столкнулся с ней, есть случаи, когда вы не управляете селектором, передаваемым функции jQuery.

Проблема, недостаточно изложенная в том, что если селектор недействителен jQuery выдает ошибку (это важно, потому что здесь ответ).

Пример использования jQuery v1.9.1:

$('##somewhere');

Он регистрирует в консоли следующую строку:

throw new Error( "Syntax error, unrecognized expression: " + msg );

источник которого находится в строке 4421 файла jQuery.js (версия без сжатия и без сжатия).

Таким образом, вместо поиска внутреннего метода jQuery (которыйможет, конечно, упростить вещи, но не доступен), вы можете просто перечислитьru Ошибка, выдаваемая для определения допустимости селектора:

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?!?'));

С уважением.

РЕДАКТИРОВАТЬ: добавлена ​​проверка типа: селектор должен быть строкой.В любом случае это частичное решение, оно не возвращает false для селекторов, определенных как строковые объекты var selector = new String('#@wrong-selector#!');, которые не являются примитивным типом.

4 голосов
/ 08 июня 2011

Код jQuery для определения допустимого селектора имеет длину около 108 строк, поэтому не ожидайте определить, является ли он действительным селектором или нет в одном операторе RegEx.

Лучше всего, вероятно, взглянуть на то, что jQuery определяет как действительный селектор, и создать функцию, которая по существу проверяет тот же способ, но возвращает, действителен ли он или нет.

https://github.com/jquery/jquery/blob/master/src/core.js#L80-188

4 голосов
/ 08 июня 2011

Множество строк могут технически быть селектором, как $('blah') может выбирать пользовательские элементы!Нет никакого хорошего способа узнать намерение того, что делать с аргументом, переданным вашей функции, поэтому лучше иметь четко определенную структуру, как прокомментировал Габи.

Селектор:

yourFunction({ selector: 'div' });

Или

yourFunction({ value: 'testing' });

В вашем коде будет другой маршрут.

Без этой техники лучшее, что вы можете сделать, это просто попытаться найти jQueryэлементы, основанные на селекторе, проверьте с помощью .length, если элементы найдены, тогда предположим, что вызывающая сторона предполагала селектор jQueryДругим вариантом может быть просто документировать, что должен быть передан объект jQuery, например:

yourFunction({ value: jQuery('div') });

Тогда для другого маршрута вы можете сделать

if (value instanceof of jQuery) { .... }
4 голосов
/ 08 июня 2011

Не может быть регулярного выражения для этого, так как селекторы являются расширяемыми, и любой может добавить любое количество персональных селекторов ( с пользовательскими символами и т. Д. ) ...

Возможно, вам следует попробовать передать свои аргументы как один объект с именованными параметрами.

{ selector:'...', 
  otherargument:'somevalue', 
  afunction: function(){...}
}
0 голосов
/ 13 января 2013

Это не отвечает на ваш вопрос, но я думаю, что это может быть полезно. Он не проверяет, является ли аргумент селектором 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...