有没有办法验证(验证它的构造是否正确)一个Sizzle选择器而不运行它?
答案 0 :(得分:7)
好吧,正如Russ所说,由于Sizzle解释了选择器,它无法在不进行评估的情况下对其进行验证。
但是,您可以捕获Sizzle抛出的异常以确定选择器是否有效:
function isSelectorValid(selector)
{
try {
$(selector);
} catch (x) {
return false;
}
return true;
}
您可以测试此解决方案here。
编辑:为了历史,我的原始(和过度设计的)答案是:
但是,可以暂时覆盖Sizzle的错误管理,以便从其上一次解析操作的错误状态中提取布尔值。以下解决方案利用了jQuery通过$.find
(到目前为止)公开Sizzle的事实:
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;
}
}
这可以说是一个可怕的黑客攻击,但它确实有效:你可以测试它here。
答案 1 :(得分:0)
不完全是,Sizzle引擎没有编译,因此检查选择器有效性的唯一方法就是选择它。
但是,您可以这样做:
var selector = ...construct your selector ...
if ($(selector).length > 0) {
// it worked.
}