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

Javascript 确定字符串是否是有效的jQuery选择器?,javascript,jquery,jquery-selectors,Javascript,Jquery,Jquery Selectors,jQuery是否有方法确定传递给函数的参数是否是选择器 我正在为一些jQuery插件制作模板,我需要能够检查传入的参数是否是jQuery选择器。我想考虑其他数据类型,并根据传递的数据类型执行不同的方法。检测数据类型很容易,但选择器只是一个字符串,可以通过许多不同的方式构造 我的目标是创建一个插件,它可以原谅你在争论中传递的东西,并对如何处理它做出明智的决定。以jQueryUI插件为例,在一些插件中,假设我们在参数placeholder中传递一个回调函数,表示速度的数字,它仍然接受回调并运行它,并

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

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

我的目标是创建一个插件,它可以原谅你在争论中传递的东西,并对如何处理它做出明智的决定。以jQueryUI插件为例,在一些插件中,假设我们在参数placeholder中传递一个回调函数,表示速度的数字,它仍然接受回调并运行它,并使用默认值表示速度。这就是我想要的功能,选择器是一个非常独特的例子

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


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

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

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

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

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

您最好的选择可能是查看jQuery确定为有效选择器的内容,并生成一个基本上以相同方式进行检查的函数,但返回它是否有效

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

选择器:

yourFunction({ selector: 'div' });

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


如果没有这种技术,最好的方法就是让jQuery根据选择器查找元素,使用
.length
进行检查,如果找到了元素,则假定调用者希望使用jQuery选择器。另一个选项可能只是记录必须传递的jQuery对象,即:

yourFunction({ value: jQuery('div') });
然后换一条不同的路线

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

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

$.fn.inDom = function() { return $(document).find(this).length; };
顺便说一句:我不直接使用
$(选择器).length,因为如果传递的参数是
HTMLNode
,它将返回
1

为了更好地解释:

$('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
$('foo')。长度//0
$('.foo')。长度//0
$('#foo')。长度//0
$('').length//1
$(文档)。查找('foo')。长度//0
$(文档).find('.foo').length//0
$(文档)。查找('#foo')。长度//0
$(文档).find(“”).length//0

直截了当地说:

  • 否,jQuery没有检查选择器是否有效的方法
  • jQuery为此有很多正则表达式,这就是为什么在代码中找不到正则表达式的原因
  • 您不必为此编写庞大的正则表达式,答案更简单,如下所示
  • 我理解您的问题,因为我经历过,在某些情况下,您无法控制给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(“#@错误选择器”#!”),它不会返回false

    为什么不传递实际的jQuery对象
    $('selector')
    应该很容易检查…@jcinacio:谢谢,但实际上我也在检查。我的目标是创建与传入内容完全无关的参数。
    $('selector')
    不适合此目的,因为如果无效,它将抛出一个错误。“尝试让jQuery根据选择器查找元素,请使用.length检查,如果找到元素,则假定调用方希望使用jQuery选择器”----这很好。@upclix没有要求检查选择器是否匹配某些内容,或者哪个角色具有它所选择的内容,但是根据选择器语法的jQuery规则,它是否有效。@upclix“尝试让jQuery根据选择器查找元素,请使用.length进行检查,如果找到元素,则假定调用者使用的是jQuery选择器”-坏主意,有些字符串用作jQuery选择器时会引发异常,请尝试使用”(“感谢您的直截了当的解释!不幸的是,该测试不是防弹的。您可以将原始HTML字符串传递给jQuery,它会将其转换为节点,而不会引发异常。因此,
    isValidSelector(

    ”)

    返回true,即使它不是一个有效的选择器。在我执行此操作时,函数无法检查输入是否为字符串-将节点或jQuery对象传递给它,
    isValidSelector($(“.foo”)
    返回true。@hashchange您是对的,但我假设任务不是检查给定的选择器是否与文档中的内容匹配(jQuery已经通过alert($.isValidSelector('#what?!?'));