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

UpH*_*lix 9 javascript jquery jquery-selectors

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

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

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

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

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

Ema*_*nde 30

直截了当地说:

  1. 不,jQuery没有方法来检查选择器是否有效.
  2. jQuery有很多Regex',这就是为什么你在代码中找不到一个.
  3. 你不必为此写一个巨大的正则表达式,答案更简单,如下所示.

我理解你的问题,因为我经历过它,有些情况下你无法控制选择器来提供给jQuery函数.

没有概述的问题是,如果选择器无效,jQuery会抛出错误(这很重要,因为这是答案).

使用jQuery v1.9.1的示例:

$('##somewhere');
Run Code Online (Sandbox Code Playgroud)

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

throw new Error( "Syntax error, unrecognized expression: " + msg );
Run Code Online (Sandbox Code Playgroud)

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

因此,您可以只监听抛出的错误以确定选择器是否有效,而不是寻找jQuery的内部方法(它可以简化但不可用).

function isValidSelector(selector) {
    if (typeof(selector) !== 'string') {
        return false;
    }
    try {
        var $element = $(selector);
    } catch(error) {
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

你也可以把它变成一个jQuery插件:

jQuery.extend({
    isValidSelector: function(selector) {
        if (typeof(selector) !== 'string') {
            return false;
        }
        try {
            var $element = $(selector);
        } catch(error) {
            return false;
        }
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

以这种方式使用:

alert($.isValidSelector('#what?!?'));
Run Code Online (Sandbox Code Playgroud)

最好的祝福.

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

  • 正是我需要的.一千个投票! (2认同)

Gar*_*een 5

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

选择器:

yourFunction({ selector: 'div' });
Run Code Online (Sandbox Code Playgroud)

或者

yourFunction({ value: 'testing' });
Run Code Online (Sandbox Code Playgroud)

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

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

yourFunction({ value: jQuery('div') });
Run Code Online (Sandbox Code Playgroud)

然后对于不同的路线,你可以这样做

if (value instanceof of jQuery) { .... }
Run Code Online (Sandbox Code Playgroud)

  • @UpHelix“尝试 jQuery 根据选择器查找元素,检查 .length,如果找到元素,则假设调用者想要一个 jQuery 选择器” - 坏主意,有些字符串在用作 jquery 选择器时会抛出异常,尝试一些带有“(”的东西 (2认同)