强制JavaScript EventListener仅执行一次?

21

我想知道是否有可能在条件不为真的情况下,强制执行 JavaScript 事件监听器一次,然后继续监听直到满足条件以便执行更多操作?


1
“without the condition being true”…什么条件?另外,如果它只会触发一次,然后继续监听,然后可能再次触发,那么…它不是只触发一次。除非你的意思是你只想一次处理一个事件(而不是同时处理多个事件)? - KOGI
你使用JavaScript框架吗?我认为在ExtJS中是可能的。在jQuery中也许也可以。 - Marc
jQuery有一个.one()方法,但我不确定它是否完全符合您的要求。虽然您可以在处理程序中重新绑定事件。这将导致不处理同时发生的事件,然后在处理程序完成后再次开始监听事件。http://api.jquery.com/one/ - KOGI
1
可能是只触发一次事件?的重复问题。 - rofrol
可能是如何在JavaScript中触发事件?的重复问题。 - ivan_pozdeev
我想你想运行一个事件监听器,只运行一次,不带事件或者带事件但忽略某些自定义条件。这是两个不同的问题,从回答中判断,你的问题还不太清楚。尝试更好地阐述它,并思考我们需要什么信息来帮助你。 - Sheepy
3个回答

61
var clickFunction = function (event) {
    //do some stuff here
    window.removeEventListener('click',clickFunction, false );

};
window.addEventListener("click", clickFunction, false);
这将允许您执行clickFunction一次,闭包的神奇之处在于removeEventListener可以找到clickFunction。无需使用库来完成简单的任务。

3
如果你需要在代码中使用这个模式超过两次,那么这很快会成为一个问题。在 CSS 动画的情境中,这种情况非常普遍,你有一个动画 "钩子过渡结束、设置变化、使过渡结束自动移除",通常你需要将它们串联起来。类似于 http://hastebin.com/ikixonajuk.coffee 的模式更易于维护。在 NodeJS 中,它被称为 "once"。 - Dmytro
  1. 在2011年回答这个问题时,once还不可用。
  2. 这是原始问题中的客户端实现问题,因此nodejs没有帮助。
  3. 您的CoffeeScript本质上是相同的想法,稍作修改。
- Jlam
1
现在浏览器中是否已经支持is once,还是我们仍然需要发明它/使用臃肿的第三方库来实现它? - Dmytro
实现自己的once函数只需要几行代码,类似这样的代码可以运行。window.once = function(aFun) { var clickFunction = function (event) { aFun(); window.removeEventListener('click',clickFunction, false ); }; window.addEventListener("click", clickFunction, false); }window.once(function() { .... }) - Jlam
我知道,我之前发布了这个参考链接,它适用于任何事件 http://hastebin.com/ikixonajuk.coffee。当涉及到代码的整洁程度时,仅仅存在和必须发明之间的差异是相当大的。但就目前而言,我发现我处理的大多数事件都是“只运行一次”的。即使在调用后,“load”也可以被删除,因此令人惊讶的是没有内置的方法。原生实现可能也更有效率。 - Dmytro

0
如果您将代码封装在一个函数中,只需在页面加载时调用该函数即可。
编辑以添加示例:
不知道您的事件是什么,但这里有一个示例:
<a ..onclick='someFunction()'>click</a>

<script type='text/javascript'>
function someFunction() {
  // do whatever
}

// call the function
someFunction();
</script>

如果您需要将函数绑定到特定上下文中,可以使用jQuery的proxy()方法。http://api.jquery.com/jQuery.proxy/ - KOGI

0
如果我正确理解了您的问题,您只想一次处理一个事件(如果一个事件在快速连续触发多次,您只想处理其中一个),然后一旦处理程序完成,您将继续监听更多事件。是这样吗?
jQuery有一个.one()方法api.jquery.com/one 它只处理一次事件,但如果您在处理程序中重新绑定事件,那么它将按照您的要求运行。
function handler( )
{
    // do stuff

    $(this).one( 'click', handler );
}

$('.someElement').one( 'click', handler );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接