2011-06-08 95 views
8

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

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

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

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

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

+0

为什么不传递实际的jQuery对象? '$('selector')'应该很容易检查... – 2011-06-08 18:18:21

+0

@jcinacio:谢谢,但我实际上也在检查。我的目标是创建一个非常随意的参数。 – UpHelix 2011-06-08 18:25:02

+0

'$('selector')'不适合这个目的,因为如果它无效,就会抛出一个错误。 – 2013-06-02 20:29:59

回答

4

许多字符串可以技术上$('blah')选择可以选择自定义元素!没有什么好的方法可以知道如何处理传递给你函数的参数,所以最好有一个像Gaby所说的定义良好的结构。

选择:

yourFunction({ selector: 'div' }); 

或者

yourFunction({ value: 'testing' }); 

将会在您的代码不同的路线。

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

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

那么对于不同的路线,你可以做

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

“尝试让jQuery根据选择器查找元素,使用.length检查,如果找到元素,则假定调用者使用jQuery选择器”----这非常好。 – UpHelix 2011-06-08 18:30:06

+0

@UpHelix没有要求检查一个选择器是否匹配某个东西,或者它选择了什么样的角色,但是如果它根据选择器语法的jQuery规则是有效的。 – 2013-06-02 20:31:09

+2

@UpHelix“尝试让jQuery根据选择器查找元素,使用.length检查,如果找到元素,则假定调用者使用jQuery选择器” - 糟糕的主意,有些字符串在用作jQuery选择器时会抛出异常,只是尝试用“(” – Rui 2013-11-11 11:46:04

4

不可能有这个正则表达式,因为选择是可扩展的,任何人都可以加入的个人选择(与自定义的符号等)...

任意数量也许你应该尝试传球您的参数作为具有命名参数的单个对象。

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

确定选择的jQuery代码是有效的大约108线长,所以不要指望,以确定它是否在一个正则表达式语句是一个有效的选择与否。

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

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

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 
+0

确实有帮助:)我只想补充说,如果输入字符串不是选择器,它会引发错误。为了赢得挑剔的比赛,我实际上会返回一个合适的布尔值而不是长度。像这样:'function selectorExists(selector){try {return $(document).find(selector).length!== 0; } catch(e){return false; }}'...并且你不喜欢单行注释格式;) – hashchange 2016-07-04 12:16:28

26

直来直去地说:

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

我明白你的问题,因为我经历过,有些情况下你不能控制选择器给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。

+2

正是我需要的。一千个投票! – Ziggy 2013-06-11 00:43:37

+0

感谢您的直接解释! – 2014-07-16 11:51:18

+0

不幸的是,这个测试不是防弹的。您可以将原始HTML字符串传递给jQuery,并将其转换为节点并且不会引发异常。所以'isValidSelector(“

”)'返回true,即使它不是一个有效的选择器。 – hashchange 2016-07-04 12:01:39

相关问题