当用户点击页面或按下任何键时,我只需要做一次操作。我通常会使用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");
});