一意の名前付きイベントを要素に追加および削除して、イベントが2回以上追加されないようにする方法が必要です。要素にイベントを追加すると、2つが同じイベントであることが意図されている場合でも、それらは互いにスタックされます。単純ですが抽象化された例の場合:
$('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()のようなメソッドを使用しようとしましたが、一度に1つのイベントしか許可されません。
$('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
私の質問は2つです:
- これを行うためのより良い方法はありますか?
- 指定されたイベントのみを(名前で)削除する.offUnique()と同等の方法を実行するにはどうすればよいですか?