首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定字符串是否为有效的jQuery选择器?

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

Stack Overflow用户
提问于 2011-06-09 02:09:47
回答 5查看 9.9K关注 0票数 13

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

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

我的目标是创建能够容忍你传入的参数的插件,并对如何处理它做出明智的决定。以jQuery UI插件为例,在一些插件中,假设我们在参数占位符中传递了一个回调函数,用于表示速度的数字,它仍然接受回调并运行它,并使用表示速度的默认值。这就是我想要的功能,选择器是一个非常独特的例子。

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

如果没有,我想我将不得不为此编写一个巨大的正则表达式?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-09 02:26:03

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

选择器:

代码语言:javascript
复制
yourFunction({ selector: 'div' });

代码语言:javascript
复制
yourFunction({ value: 'testing' });

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

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

代码语言:javascript
复制
yourFunction({ value: jQuery('div') });

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

代码语言:javascript
复制
if (value instanceof of jQuery) { .... }
票数 4
EN

Stack Overflow用户

发布于 2013-06-03 04:21:14

开门见山:

  1. 不,jQuery没有方法来检查选择器是否有效。
  2. jQuery有很多正则表达式,这就是为什么你在代码中找不到的原因。
  3. 你不必为此编写大量的正则表达式,答案如下所示。

我理解你的问题,因为我经历过,在某些情况下,你无法控制要给jQuery函数提供的选择器。

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

使用jQuery v1.9.1的示例:

代码语言:javascript
复制
$('##somewhere');

它以下行登录到控制台:

代码语言:javascript
复制
throw new Error( "Syntax error, unrecognized expression: " + msg );

该源位于jQuery.js文件的行4421处(未缩小且未压缩的版本)。

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

代码语言:javascript
复制
function isValidSelector(selector) {
    if (typeof(selector) !== 'string') {
        return false;
    }
    try {
        var $element = $(selector);
    } catch(error) {
        return false;
    }
    return true;
}

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

代码语言:javascript
复制
jQuery.extend({
    isValidSelector: function(selector) {
        if (typeof(selector) !== 'string') {
            return false;
        }
        try {
            var $element = $(selector);
        } catch(error) {
            return false;
        }
        return true;
    }
});

要这样使用:

代码语言:javascript
复制
alert($.isValidSelector('#what?!?'));

诚挚的问候。

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

票数 31
EN

Stack Overflow用户

发布于 2011-06-09 02:15:00

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

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

代码语言:javascript
复制
{ selector:'...', 
  otherargument:'somevalue', 
  afunction: function(){...}
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6283255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档