确定字符串是否是有效的jQuery选择器?

时间:2011-06-08 18:09:47

标签: javascript jquery jquery-selectors

jQuery是否有一个方法来确定传递给function的参数是否是一个选择器?

我正在为一些jQuery插件制作模板,我需要能够检查传入的参数是否是jQuery选择器。我想允许其他数据类型,并根据传递的数据类型执行不同的方法。检测数据类型很简单,但选择器只是一个字符串,可以通过多种不同方式构建。

我的目标是创建一些插件,这些插件可以为您传递参数的内容提供宽恕,并就如何处理这些插件做出明智的决定。以jQuery UI插件为例,在一些插件中,假设我们在参数占位符中传递一个回调函数,该函数用于速度的数字,它仍然需要回调并运行它并使用默认的速度。这就是我想要的功能,选择器是一个非常独特的案例。

jQuery是否为此编写了一个正则表达式?我在代码中找不到一个。

如果没有,我想我只需为此写一个巨大的正则表达式?

5 个答案:

答案 0 :(得分:30)

直截了当地说:

  1. 不,jQuery没有办法检查选择器是否有效。
  2. jQuery有很多Regex',这就是为什么你在代码中找不到一个的原因。
  3. 你不必为此写一个巨大的正则表达式,答案更简单,如下所示。
  4. 我理解你的问题,因为我经历过,有些情况下你不能控制选择器来提供给jQuery函数。

    问题没有得到充分说明,如果选择器无效 jQuery会抛出错误(这很重要,因为这是答案)。

    使用jQuery v1.9.1的示例:

    $('##somewhere');
    

    它在控制台中登录以下行:

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

    哪个源位于jQuery.js文件的第4421行(非缩小和未压缩版本)。

    所以,不是寻找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?!?'));
    

    最好的问候。

    修改 添加类型验证:选择器必须是字符串。 无论如何它是一个部分解决方案,它不会为定义为字符串对象var selector = new String('#@wrong-selector#!');的选择器返回false,它们不是基本类型。

答案 1 :(得分:4)

没有这方面的正则表达式,因为选择器是可扩展的,任何人都可以添加任意数量的个人选择器(带有自定义符号等)...

也许您应该尝试将您的参数作为具有命名参数的单个对象传递。

{ selector:'...', 
  otherargument:'somevalue', 
  afunction: function(){...}
}

答案 2 :(得分:4)

用于确定选择器有效的jQuery代码大约有108行,因此不要期望在一个RegEx语句中确定它是否是有效的选择器。

你最好的选择可能是看看jQuery确定哪个是有效的选择器,然后创建一个基本上以相同方式检查的函数,但返回它是否有效。

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

答案 3 :(得分:4)

很多字符串可以技术上成为像$('blah')这样的选择器可以选择自定义元素!没有任何好的方法可以知道 intent 如何处理传递给你的函数的参数,所以最好有一个像Gaby评论的定义良好的结构。

选择器:

yourFunction({ selector: 'div' });

或者

yourFunction({ value: 'testing' });

在您的代码中采用不同的路线。

如果没有这种技术,你可以做的最好的事情就是尝试jQuery根据选择器查找元素,检查.length,如果找到了元素,则假设调用者想要一个jQuery选择器。另一种选择可能只是记录必须传递jQuery对象,即:。

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

然后,您可以使用其他路线

if (value instanceof of jQuery) { .... }

答案 4 :(得分:0)

这不能回答你的问题,但我认为这可能会有所帮助。它不检查参数是否是jQuery选择器,但它会测试文档中是否存在选择器。

$.fn.inDom = function() { return $(document).find(this).length; };

BTW:我不直接使用$(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