【问题标题】:How to prevent multiple event calling with jQuery on("change")如何防止使用 jQuery on("change") 调用多个事件
【发布时间】:2018-01-23 22:34:01
【问题描述】:

我在这段代码中有重复的事件,该代码故意应该运行多次:

$('selector').on('change', myFunction);

然后我做了一些谷歌搜索,我发现我可以/应该这样做

$('selector').off('change', myFunction).on('change', myFunction);

先解除绑定,这是有道理的,但我仍然遇到同样的问题,最终导致多重绑定。

然后奇怪的是,我更改了代码,在 off() 部分的函数名称后包含 () 并且它起作用了!

$('selector').off('change', myFunction()).on('change', myFunction);

所以,我的问题是:我在 off() 部分使用 myFunction() 而不是 myFunction 做得对吗?

【问题讨论】:

  • 我的意思是,代码现在运行良好,正如它所设想的那样。但是为什么我需要在off 上而不是on 上包含 ()

标签: javascript jquery events onchange


【解决方案1】:

http://api.jquery.com/off/

没有off 重载接受您调用它的参数集。您的“工作”代码与

相同
$('selector').off('change').on('change', myFunction);

.off('change', myFunction()) 中执行myFunction 会产生不必要的副作用。

【讨论】:

  • 这可以更改为$('selector').off('change.myFn').on('change.myFn', myFunction);,因此其他更改处理程序不会被取消。
  • @Sagar 正确。更多关于“事件命名空间”的合格事件 - api.jquery.com/on
  • @Igor,谢谢!我明白了。奇怪的是,即使使用“事件命名空间”执行off,我仍然会得到多个绑定......我会检查我是否在其他地方做其他事情。
  • @RafaelTrevisan - 展示你是如何做到的 - 你可以将新版本的代码添加到问题中,当然保留原始代码
【解决方案2】:

只需在页面加载时委托一次事件,不要添加多个侦听器

$(document).on('change','selector', myFunction);

我使用了document,但您可以将其移至页面中作为元素祖先的更接近的永久资产

【讨论】:

  • 没那么简单。我将这些绑定动态附加到也动态呈现的元素上;-)
  • 但这正是事件委托的用途......所以是的,就是这么简单。见Understanding event delegation
  • 就是这么简单。您不应该尝试“修复”重复绑定。首先你不应该重复绑定。
  • 我同意,@Taplar。但有时这里和那里的 hacky 可能会节省一些开发时间。
  • @charlietfl,我再看看它。 tks
【解决方案3】:

经过一番研究,我发现它可以正常使用

$('selector').off('.myNamespace').on('change.myNamespace', myFunction);

这样做我最终不会取消绑定任何其他事件,我只是取消绑定我真正需要的那个。

PS.:我仍然不知道为什么$('selector').off('change', myFunction) 不起作用,但我会继续前进。

谢谢。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多