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 选择器
你不能。几乎任何东西都可以是选择器,例如我的页面可能包含一堆blah
s,这将使$("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