Javascript 有没有办法验证Sizzle选择器?
有没有办法在不运行Sizzle选择器的情况下验证它是否正确构造了Sizzle选择器?不完全是这样,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引发的
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;
}
}