如何在jQuery中只对多个事件触发一次回调

How to trigger callback on multiple events only once in jQuery

本文关键字:回调 一次 事件 jQuery      更新时间:2023-09-26

当用户点击页面或按下任何键时,我只需要做一次操作。我通常会使用jQuery中的.one()函数来执行此操作,但回调会为两个事件调用一次,而不是总共调用一次:

$("html").one("click keydown", function() {
   alert("event");
});

我无法调用$(this).unbind("click keydown"),因为我不想解除可能绑定到元素的其他事件的绑定。

编辑:我之前应该提到过这一点,但绑定事件的代码被调用了多次,我希望每次绑定回调都运行一次。如果事件绑定了n次,我希望回调运行n次。

您可以在事件处理程序之外创建函数:

var onClickAndKeydown = function(){
    alert("event");
}

然后使用.on():向事件添加处理程序click并向下键单击该函数

$("html").on("click keydown", onClickAndKeydown);

当您需要时,您可以使用.off():删除该函数的事件处理程序

$("html").off("click keydown", onClickAndKeydown);

.off()方法删除与.on()一起附加的事件处理程序。如果您在.off()中指定函数的地址,那么将仅删除该函数的处理程序,因此仍将处理其他函数的处理程。

使用带名称空间的事件名称

$("html").one("click.myonce keydown.myonce", function () {
    console.log("event");
    $(this).off('click.myonce keydown.myonce')
});

演示:Fiddle

尝试使用off()之类的

$("html").on("click keydown", function(e) {
   alert(e.type);
   $(this).off("click keydown");
});

演示

您也可以为jQuery编写自己的插件,它可以很好地处理这一问题;

jQuery.fn.onceFor = function (events, func) {
    var that = this;
    this.on(events, function () {
        that.off(events, func);
        return func.apply(this, arguments);
    });
};

然后你会通过它打电话;

$("html").onceFor("click keydown", function() {
   alert("event");
});