【问题标题】:Double event handler and one function. How to prevent executing code twice?双事件处理程序和一个函数。如何防止两次执行代码?
【发布时间】:2016-02-29 08:52:33
【问题描述】:

所以我有一个回调函数绑定到两个事件(changefocusout)。但是,只有当我们与之交互的元素不是 checkbox 时,我才需要聚焦。

这是示例代码:

$(document).on('focusout change', '.selector', function() {
    if ($(this).is(':checkbox')) {
        // Do stuff and prevent the focusout to trigger. HOW???
    }

    doStuff(); // Action that applies to both cases, but needs to be limited at one execution only
});

上面的代码会执行两次:

  • 当复选框被选中/取消选中时
  • 当您在复选框外部单击时(失去焦点(模糊))

我尝试使用.off,但它最终完全杀死了focousout 处理程序,稍后我将需要它来处理其他不是复选框的元素。

防止focusout 处理程序触发某些元素的方法是什么?

【问题讨论】:

  • 不要将事件监听器添加到您不想监听这些事件的元素 - 明智地使用类会有所帮助
  • 嗯,我需要focusout 来处理一百万种不同的事情,而且我还需要避免代码重复。
  • 好吧,给你不想要的类添加一个类,并在你的代码中寻找它和事件名称(它将是焦点或更改) - 你的代码不够清晰不幸的是,举个例子-但这里有一个提示。事件处理程序接收触发处理程序的事件作为它的第一个参数,该参数有一个名为 name 的属性,它是事件的名称(focusout/change) - 鉴于此以及您必须已经拥有的逻辑来识别您的元素不想让focusout事件执行你的代码,你应该可以很容易地避开代码
  • @JaromandaX 您可以发布您的event.type 建议作为答案,我会接受。我通过使用它解决了这个问题。
  • 哦,是type 而不是name ...看,教你钓鱼而不是给你一条鱼:p

标签: javascript jquery events javascript-events event-handling


【解决方案1】:

你想做的是

$(document).on('focusout change', '.selector', function(event) {

event 是一个事件对象,它具有属性,其中之一是type。检查type,您现在可以查看您的函数是否因为focusoutchange 而被调用,并根据需要运行代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多