Javascript 有没有办法验证Sizzle选择器?

Javascript 有没有办法验证Sizzle选择器?,javascript,jquery,sizzle,Javascript,Jquery,Sizzle,有没有办法在不运行Sizzle选择器的情况下验证它是否正确构造了Sizzle选择器?不完全是这样,Sizzle引擎没有编译,因此检查选择器有效性的唯一方法是选择它 但是,您可以这样做: var selector = ...construct your selector ... if ($(selector).length > 0) { // it worked. } 正如Russ所说,由于Sizzle解释了选择器,因此它无法在不进行评估的情况下验证它 但是,您可以捕获Sizzle引发的

有没有办法在不运行Sizzle选择器的情况下验证它是否正确构造了Sizzle选择器?

不完全是这样,Sizzle引擎没有编译,因此检查选择器有效性的唯一方法是选择它

但是,您可以这样做:

var selector = ...construct your selector ...
if ($(selector).length > 0) {
 // it worked.
}

正如Russ所说,由于Sizzle解释了选择器,因此它无法在不进行评估的情况下验证它

但是,您可以捕获Sizzle引发的异常,以确定选择器是否有效:

function isSelectorValid(selector)
{
    try {
        $(selector);
    } catch (x) {
        return false;
    }
    return true;
}
您可以测试此解决方案

编辑:看在历史的份上,我的原始和过度设计的答案是:

但是,可以临时覆盖Sizzle的错误管理,以便从其上次解析操作的错误状态中提取布尔值。以下解决方案利用了jQuery通过$.find公开Sizzle这一事实:


这可以被认为是一个可怕的黑客行为,但它是有效的:你可以测试它。

错误构造的选择器的例子是什么?呃,你可以在javascript中检查它console@roatin:或[或.或许多其他字符串。您想实现什么?如果您担心速度,那么只提供一个空的上下文$selector,emptyContext怎么样。@Roatin:任何与语言语法不匹配的内容:这并不能区分不匹配的选择器和不匹配元素的有效选择器ts。你也可以在catch block中返回false。@SLaks,非常好的一点!我会立即更新我的答案,谢谢:@SLaks,你完全正确,我想我完全被迷住了。答案被修改了,现在我想我会离开计算机一段时间。再次感谢你的提醒:谢谢你的伟大答案-完成with JSFIDLE!我没有想到Sizzle会在糟糕的选择器上出现错误。我想我已经习惯了jQuery在我不喜欢的事情上默默地失败。
function isSelectorValid(selector)
{
    var oldErrorMethod = $.find.error;
    try {
        $.find.error = function(msg) {
            valid = false;
            oldErrorMethod(msg);
        };
        $(selector);
        return true;
    } catch (x) {
        return false;
    } finally {
        $.find.error = oldErrorMethod;
    }
}