jQuery - isSelector 函数

Posted

技术标签:

【中文标题】jQuery - isSelector 函数【英文标题】:jQuery - isSelector function 【发布时间】:2012-03-08 02:03:49 【问题描述】:

我没有找到任何对我的特殊情况有帮助的东西,所以这里有一个问题:对于一个特定的字符串,如何检查它是否是一个合适的 jQuery 选择器(暂时让我们让它简单一些,并限制自己使用非自定义jQuery 选择器),或者如果这太难了,有效的 CSS 选择器 - 基本上:

$.isSelector("div") = return true
$.isSelector("* [") = return false - unclosed attribute selector
$.isSelector("* []") = return false - empty attribute selector
$.isSelector("* [name]") = return true
$.isSelector("/hiThere") = return false - invalid / character
$.isSelector("body > ") = return false - > without following child selector
$.isSelector("body > [name=\\\[girls_just_want_to_have_fun\\\]].on a .beach") = return true

可能有一个内部 jQuery 函数进行检查(或 RegExp),但我的巫术太差了,找不到它。

大概是这样的:

function isSelector(string)
 
   try 
    
       $(string); 
       return true;
    
   catch(e) 
    
       return false; 
   

可以解决问题,但似乎有点极端。

干杯!

【问题讨论】:

基本用法是 如果 isSelector($(this).href) 以模式显示 的内容, 否则,如果 isUrl($(this).href) 将通过 ajax 加载 /url/ 的内容,否则,如果 isNumeric($(this).href) 将显示 $(this).href 鳄鱼。 正如@karim79 在他的回答下的 cmets 中指出的那样,您最好的办法是检查您返回的 jQuery 对象的 length 不是真的 - 即使我的文档不包含段落,isSelector('p') 也应该返回 true。用我的想法更新了我的问题。 【参考方案1】:

对于一个特定的字符串,如何检查它是否是一个正确的 jQuery 选择器

你不能。几乎任何东西都可以是选择器,例如我的页面可能包含一堆blahs,这将使$("blah") 完全有效。

jQuery 确实对您作为参数传递的字符串进行了一些检查,这发生在核心的 init 方法中,我已在源浏览器中为您突出显示:

https://github.com/jquery/jquery/blob/master/src/core.js#L78-186

【讨论】:

好的,但是如果是这种情况,那么请考虑一下不可靠的正则表达式地狱,您将深入研究以“验证选择器字符串”。 是的,Xhtml 完全有效。但是你可以使用 CSS XHTML,所以我不知道这有什么关系 :) 我希望 jQuery 有某种内部函数来检查这类东西,它可以优雅地处理事情,而不是在出现问题时抛出异常。 @eithed - 它不是为了保持链接。我总是可以做$("foobar > [shizmo=derp *]").add(this).hide();,如果this 是一个有效元素,它仍然会被隐藏,因为jQuery 总是返回自己。 嗯?我对foobar > [shizmo=derp*] 没有问题,只要它存在,this 就会存在,并且应该添加到每个这样的元素中,是的,那么它应该隐藏this。但是,如果我要做这样的事情:$("foobar > [shizmo=derp*").add(this).hide() 我不希望 jQuery 返回一个空数组。它应该给我一个例外,该死的...... @eithed - 呵呵,好吧,也许你最好通过访问 jQuery 对象的 .length 属性来检查这些元素是否存在。【参考方案2】:

我用过这个解决方案:

function isSelector(string)

    var ns = document.styleSheets[0];

    if (!ns)
    
        document.getElementsByTagName('head')[0].appendChild(document.createElement('style'));
        ns = document.styleSheets[0];
    

    try
    
        ns.insertRule(string+" ", 0);
        ns.deleteRule(0);

        return true;
    
    catch(e)
    
        return false;
    

另外,这个(有效的)例子

isSelector('#\\~\\!\\@\\$\\%\\^\\&\\*\\(\\)\\_\\+-\\=\\,\\.\\/\\\'\\;\\:\\"\\?\\>\\<\\[\\]\\\\\\\\\\|\\`\\#')`

返回真

【讨论】:

以上是关于jQuery - isSelector 函数的主要内容,如果未能解决你的问题,请参考以下文章

jquery问题,怎样让选择器获取通过变量获取相应的id:例如,我想让jquery获取#sel01,#sel02,#sel03

jquery学习之路之核心函数

JQuery核心函数和静态方法

jQuery 选择器

jQuery中$()函数的7种用法汇总

jQuery源码解读三选择器