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

Javascript 如何在jQuery中只对多个事件触发一次回调,javascript,jquery,events,Javascript,Jquery,Events,当用户点击页面或按下任何键时,我只需要做一次。我通常会在jQuery中使用.one()函数来执行此操作,但对两个事件都调用一次回调,而不是只调用一次: $("html").one("click keydown", function() { alert("event"); }); 我无法调用$(this)。取消绑定(“单击向下键”),因为我不想取消绑定可能绑定到元素的其他事件 编辑: 我以前应该提到过这一点,但是绑定事件的代码被多次调用,我希望回调在每次绑定时运行一次。如果事件绑定了n次,

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

$("html").one("click keydown", function() {
   alert("event");
});
我无法调用
$(this)。取消绑定(“单击向下键”)
,因为我不想取消绑定可能绑定到元素的其他事件

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

尝试使用like

尽量使用like


使用命名空间事件名称

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

演示:

使用命名空间的事件名称

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

演示:

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

var onClickAndKeydown = function(){
    alert("event");
}
然后将处理程序添加到事件中,单击并使用以下命令向下键控该函数:

需要时,可以使用以下方法删除该函数的事件处理程序:


该方法删除附加的事件处理程序。如果在内部为函数指定地址,则将仅删除该函数的处理程序,因此其他函数的处理程序仍将被处理。

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

var onClickAndKeydown = function(){
    alert("event");
}
然后将处理程序添加到事件中,单击并使用以下命令向下键控该函数:

需要时,可以使用以下方法删除该函数的事件处理程序:


该方法删除附加的事件处理程序。如果您在内部指定函数的地址,则将仅删除该函数的处理程序,因此其他函数的处理程序仍将被处理。

您还可以为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");
});

您还可以为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");
});

嗯,这在我的案例中不起作用,因为绑定事件的代码被多次调用。我可以为每个事件在名称空间中附加一个唯一的数字,但这很难看第一次执行后-这是蒸汽压路机策略,但可能它“足够聪明:)@Hoffmann假设事件绑定了
n
次您希望函数执行
n
次吗?@Hoffmann那么除了为每个事件使用唯一的名称空间之外,我看不到任何其他解决方案。。。可能有人会想出一个更好的解决方案。由于每次调用代码时都会创建一个新的回调函数,因此PSIL0NER答案应该有效,但由于某些原因,它不会解除对event.hm的绑定。这在我的案例中不起作用,因为绑定事件的代码会被多次调用。我可以为每个事件在名称空间中附加一个唯一的数字,但这很难看第一次执行后-这是蒸汽压路机策略,但可能它“足够聪明:)@Hoffmann假设事件绑定了
n
次您希望函数执行
n
次吗?@Hoffmann那么除了为每个事件使用唯一的名称空间之外,我看不到任何其他解决方案。。。可能有人会想出一个更好的解决方案。由于每次调用代码时都会创建一个新的回调函数,因此,PSIL0NER答案应该有效,但由于某些原因,它不会解除绑定event.calling$(this).off(“单击keydown”,onClickAndKeydown);由于某些原因,回调内部没有解除事件绑定。抱歉,我的错误,我以错误的方式将参数传递给函数调用$(this).off(“单击keydown”,onClickAndKeydown);由于某些原因,回调内部没有解除事件绑定。抱歉,我的错误,我以错误的方式将参数传递给函数