我想要一些方法来向元素添加和删除唯一的命名事件,这样我就可以确保事件不会被添加超过一次。当您将事件添加到元素时,它们会相互堆叠,即使其中两个是同一个事件。对于一个简单但抽象的示例:
$('a').on("click", function(e){ console.log("Hi One"); }); // 1
$('a').on("click", function(e){ console.log("Hi One"); }); // duplicate
$('a').on("click", function(e){ console.log("Hi Two"); }); // 2
// Output will be: Hi One, Hi One, Hi Two
我尝试使用 .off().on() 之类的方法,但一次只允许一个事件。
$('a').off("click").on("click", function(e){ console.log("Hi One"); });
$('a').off("click").on("click", function(e){ console.log("Hi One"); });
$('a').off("click").on("click", function(e){ console.log("Hi Two"); });
// Output will be: Hi Two
所以我想出了这个jQuery扩展:
$.fn.onUnique = function (
/* uniqueEventName, events [,selector] [,data], handler(eventObject) */
) {
var uniqueEventNameArray = this.data("uniqueEvents") || [];
var uniqueEventName = arguments[0];
if ($.inArray(uniqueEventName, uniqueEventNameArray) == -1) {
uniqueEventNameArray.push(uniqueEventName);
this.data("uniqueEvents", uniqueEventNameArray);
this.on(arguments[1], arguments[2], arguments[3], arguments[4]);
}
};
这样就可以得到我想要的效果了...
$('a').onUnique("Hi1", "click", function(e){ console.log("Hi One"); });
$('a').onUnique("Hi1", "click", function(e){ console.log("Hi One"); });
$('a').onUnique("Hi2", "click", function(e){ console.log("Hi Two"); });
// Output will be: Hi One, Hi Two
我的问题有两个:
- 有一个更好的方法吗?
- 我将如何做相当于 .offUnique() 的操作,它只会删除指定的事件(按名称)?