【问题标题】:Alternative way to use $(element).on('change', () => {})使用 $(element).on('change', () => {}) 的替代方法
【发布时间】:2020-11-13 11:52:01
【问题描述】:

我有一个问题希望你能帮助我:

我正在使用引导选择选择器,它使用元素的 onchange 事件(我认为)

我需要向 select 元素添加另一个事件处理程序,我做了并且两者都工作正常,问题是我的页面中的每一次特定更改,我使用的表都会重新加载所有数据,当发生这种情况时,表将添加该事件处理程序再次到 select 元素,并会做同样的事情两次(或更多)

所以,在分配事件之前我尝试使用

$('.selectpicker.call').off('change')

但是当我这样做时,我也会删除引导选择选择器的事件处理程序

你们知道我可以使用什么其他技巧来代替 jquery onchange 吗?

谢谢!

【问题讨论】:

  • 让我澄清一下 - 您的代码正在调用 $(element).on('change', () => {}) 的某个版本,而您只想删除您添加的处理程序,对吗?
  • 是的,没错。这就是我想做的事

标签: javascript bootstrap-selectpicker


【解决方案1】:

您可以使用namespaces for the events 这样您就可以区分您添加的事件而不是其他事件。

让我们举一个非常简单的例子——有一个带有一些默认功能的按钮(点击我),我们可以向它添加更多的事件处理程序。我们还想清除事件处理程序但不破坏默认功能:

//assume some code outside our control
$("#clickme").on("click", () => console.log("Default functionality"));


//our code
$("#set_message").on("click", () =>{
  const message = $("#message").val();
  $("#clickme").on("click", () => console.log(message));
});
$("#clear_message").on("click", () =>{
  $("#clickme").off("click");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div>
  <input id="message" value="add your message here">
  <button id="set_message">Set message</button>
  <button id="clear_message">Clear message</button>
</div>

<div>
  <button id="clickme">Click me</button>
</div>

这不起作用,因为“清除消息”按钮会删除 所有 事件处理程序 - 是否由其他人添加。

相反,我们可以命名事件。例如click.myEvent 仍然是一个点击事件,但在myEvent 命名空间内。如果我们删除click.myEvent,它只会从该命名空间中删除事件,而其他任何东西都完好无损。所以“清除消息”现在只清除我们的事件处理程序:

//assume some code outside our control
$("#clickme").on("click", () => console.log("Default functionality"));


//our code
$("#set_message").on("click.myEvent", () =>{
  const message = $("#message").val();
  $("#clickme").on("click.myEvent", () => console.log(message));
});
$("#clear_message").on("click.myEvent", () =>{
  $("#clickme").off("click.myEvent");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div>
  <input id="message" value="add your message here">
  <button id="set_message">Set message</button>
  <button id="clear_message">Clear message</button>
</div>

<div>
  <button id="clickme">Click me</button>
</div>

【讨论】:

  • @AngelQuesada 在全球大流行期间?好的,但请不要感染我:P
【解决方案2】:

将此$('.selectpicker.call').on('change',function(){....}) 更改为$('body').on('change'','.selectpicker.call',function(){....}) 并仅加载此函数一次。

它的作用是将函数分配给body,并在.selectpicker.call 元素上触发change 事件时触发。所以即使你的数据不断变化,这个函数也不会。

【讨论】:

  • 不工作 :( 问题是当表重新加载时,该函数被再次分配给元素,因此它不止一次地做同样的事情
  • @AngelQuesada 表数据是什么?表数据重新加载会自动分配功能吗?另外,请查看 VLAZ 的答案。它应该工作
  • 是的,它有“drawCallBack”方法,每次重新加载数据时都会再次分配事件,因为所有元素都是从 0 创建的
猜你喜欢
  • 2013-01-29
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 2016-11-17
  • 1970-01-01
相关资源
最近更新 更多