我最近遇到了Sel.js,它支持Draft CSS Level 4 选择器(例如Subject 选择器,它可以让您定位匹配的 CSS 节点的父节点)。
我很想开始与jQuery结合使用这个库,并且很好奇是否有人有经验(或对如何完成的一个很好的猜测)用不同的选择器库替换jQuery 所基于的Sizzle.js选择器库(在本例 Sel.js)。
有什么想法或示例可以在网上某个地方查看以将 jQuery 与 Sizzle 解耦,并使其依赖于不同的选择器引擎?
我最近遇到了Sel.js,它支持Draft CSS Level 4 选择器(例如Subject 选择器,它可以让您定位匹配的 CSS 节点的父节点)。
我很想开始与jQuery结合使用这个库,并且很好奇是否有人有经验(或对如何完成的一个很好的猜测)用不同的选择器库替换jQuery 所基于的Sizzle.js选择器库(在本例 Sel.js)。
有什么想法或示例可以在网上某个地方查看以将 jQuery 与 Sizzle 解耦,并使其依赖于不同的选择器引擎?
这本身不一定是真正的替代品,而是一种后备。当遇到它认为是“无效的语法”时, Sizzle会抛出一个错误,例如 CSS4 主题选择器(div! > .jquery-css4
例如)。
> 未捕获的错误:语法错误,无法识别的表达式:div!> .jquery-css4
一种解决方案是针对Sizzlecatch {}
抛出的错误,然后尝试回退到 Sel.js进行选择,方法是覆盖以下函数:$()
$ = function (selector, context) {
try {
return jQuery(selector, context);
} catch (e) {
return jQuery(sel.sel(selector, context));
}
};
以这种方式覆盖后,您可以使用:
$('div! > .jquery-css4');
...这将正确返回<div>
包含 class 子级的 which .jquery-css4
。
作为替代方案,您可以创建一个简单的css4
选择插件,使用类似:
$.css4 = function(selector, context) {
return $(sel.sel(selector, context));
};
此时可以重写上面的内容:
$.css4('div! > .jquery-css4');
这种方法的好处是它不依赖错误处理,并且更具声明性。本质上——你应该知道什么时候使用 CSS4 选择器,需要额外的支持,什么时候不需要。但是 - 这两种方法都是相当非侵入性的。
但是,对于使用这些方法的任何人,请注意:我没有对使用该context
参数的查询进行广泛测试。它可能不适合Sel.js
- 所以如果您需要更进一步,请注意您可能需要进一步增强此代码。
这是一个有效的 jsFiddle,显示了实际代码。