由于对性能和内存节省的考虑开始在开发人员社区中传播开来,因此特定操作的每个处理程序都直接附加到目标元素的旧事件管理正在变得过时。
自从 jQuery用新方法更新了旧的.bind()
和方法以允许委托后,事件委托实现有了加速。.live()
.on()
这决定了一些经验丰富的方法的变化,在哪里使用事件委托需要返工。我正在尝试制定一些最佳实践,同时保持我的库的编码风格,并寻找其他开发人员面临的类似情况以找到答案。
使用带有函数的 OOP 作为构造函数,我通常有这样的对象创建接口:
var widget = new Widget({
timeout: 800,
expander: '.expanders'
});
将对象文字作为参数给出,提供传递的输入的名称和值的干净映射。此代码基础的类可能类似于以下内容:
var Widget = function(options) {
// some private members
var _timeout;
var _$widget;
var _$expander;
// methods
this.init = function() {
_timeout = options.timeout || 500;
_$expander = $(options.expander);
_$widget = _$expander.next();
_$expander.on('click', _toggle);
};
var _toggle = function(e) {
if (_$widget.is(':visible')) {
_$widget.hide(_timeout);
} else {
_$widget.show(_timeout);
}
};
this.init();
};
使用“私有”方法在代码可读性和清洁度方面给了我一些好处(只有有用的方法向用户公开),除了性能上的小幅提升(每个范围解析比局部变量花费更多时间)。但是当谈到事件处理程序时,它与事件委托范式发生冲突。
我想公开我用来在内部与班级中的听众相关联的方法:
this.toggle = function(e) {
if (_$widget.is(':visible')) {
_$widget.hide(_timeout);
} else {
_$widget.show(_timeout);
}
};
然后在外部或另一个代理类中驱动适当的委托,如下所示:
var widget = new Widget({
expander: '.expanders'
});
$(delegationContext).on('click', '.expanders', widget.toggle);
但在我看来这不是最好的方法,在接口中暴露了一个无用的方法失败,所以我尝试了一种方法,让主类直接知道所有信息以自主委托事件,通过接口:
var widget = new Widget({
timeout: 800,
expander: {
delegationContext: '.widgetContainer',
selector: '.expanders'
}
});
这将允许在类内部继续使用私有方法:
var $context = $(options.expander.delegationContext);
$context.on('click', options.expander.selector, _toggle);
您对此有何做法和建议?
到目前为止,您听说的其他开发人员的主要趋势是什么?