解耦jquery,嘶嘶声?
Posted
技术标签:
【中文标题】解耦jquery,嘶嘶声?【英文标题】:decoupling jquery, sizzle? 【发布时间】:2011-04-26 13:16:15 【问题描述】:有没有人有经验/洞察力:解耦 jquery / sizzle?
这是出于普遍的兴趣,但这是引发我问题的场景:
..我已经在项目中有 jquery。想试试http://ecsstender.org/,它需要 Sizzle 选择器引擎。 我真的不想包含 Sizzle 的第二个副本 - 它已经是 jquery 的一部分..
宁愿做这样的事情:http://forum.jquery.com/topic/further-decoupling-sizzle-and-jquery 例如创建一个依赖于外部而不是嵌入式 Sizzle 版本的 jquery 构建 - 因此 jquery、eccstender 或其他脚本可以使用相同的 Sizzle 库。似乎是个好主意。虽然我猜这可能会损害性能,但我希望看到与 jQuery 生产版本的基准比较..
有谁知道这是否已经完成? (github fork?)或者是否有充分的理由反对这种方法? .
【问题讨论】:
【参考方案1】:没有必要将 Sizzle 包含在 jQuery 构建中。它可以被删除...jQuery代码all references Sizzle.
,您可以自己抓取/编译jQuery(包括预先包含Sizzle)并将其暴露给任何其他库(实际上并未将其包含在编译版本中,只是作为extern闭包编译器)。
下面是保留嵌入的选项,但将 Sizzle 公开以供外部使用:
如果你知道会用到 jQuery(依赖),就在 jQuery 后面加上这个:
window.Sizzle = jQuery.find;
这会将 Sizzle 重新公开为您可以使用的属性。
这是从嵌入中移除 Sizzle 的手动版本:
在 jQuery (version 1.4.3 link) 中你会看到:
/*!
* Sizzle CSS Selector Engine - v1.0
* Copyright 2009, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
* More information: http://sizzlejs.com/
*/
(function()
//...
//lots of code!
//...
// EXPOSE
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
)();
将该部分替换为only:
(function()
// EXPOSE
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
)();
然后你需要做的所有事情包括Sizzlebefore jQuery 就可以了。
Here's a fiddle showing it working,包括直接来自 github 的 Sizzle,不嵌入在 jQuery 中。
【讨论】:
【参考方案2】:如果您想将 eCSStender CSS3 选择器模块与 jQuery 中捆绑的 Sizzle 一起使用,您可以这样做:
eCSStender.addMethod('findBySelector',function(selector)
var els = [];
jQuery(selector).each(function()
els.push(this);
);
return els;
);
可能有一种更简单的方法可以直接获取实际元素集合(而不是使用数组的虚假集合),但现在还为时过早,我的大脑还没有完全运转。
【讨论】:
以上是关于解耦jquery,嘶嘶声?的主要内容,如果未能解决你的问题,请参考以下文章