我一直在处理我不想要的开/关删除事件处理程序的问题,并希望使用html元素的expando id命名事件绑定。
function SomeWidget(el) {
$(document).on('handler.MY_EXPANDO_ID', this.handler.bind(this));
};
var widget = new SomeWidget($(sometargetelement));
没有唯一标识符的问题是,目前我的命名空间是相同的,当我有两个同时的小部件时会搞砸,一个被移除,它删除了两个对象的处理程序。
问题1)如何访问元素的内部expando id? 问题2)有更好的方法吗? Function.bind!== Function,它根据实际方法指针进行删除
我正在使用jQuery 1.8.3
答案 0 :(得分:1)
每当创建窗口小部件时,jQuery UI的窗口小部件工厂都会递增计数器。然后他们有一个eventNamespace
属性正是因为这个原因。你可以完成同样的事情:
function SomeWidget(el) {
SomeWidget.instances++;
var eventNamespace = ".SomeWidget" + SomeWidget.instances;
$(el).on("handler" + eventNamespace, ...);
}
SomeWidget.instances = 0;
每当创建新的SomeWidget
时,这将增加实例。在内部,它可以访问可用于绑定/解除绑定事件的eventNamespace
。
如果您需要在窗口小部件外部进行访问,则可以将eventNamespace
作为数据存储在元素中:
$(el).data("eventNamespace", eventNamespace);
但是,如果您使用相同的元素创建窗口小部件的多个实例,则会覆盖此内容。