使用 $(element).on('change', () => {}) 的替代方法
Alternative way to use $(element).on('change', () => {})
我有一个问题希望你能帮助我:
我正在使用 bootstrap select选择器,它使用元素的 onchange 事件(我认为)
我需要向 select 元素添加另一个事件处理程序,我做了并且都工作正常,问题是随着我页面中的每个特定更改,我使用的 table 重新加载所有数据,当发生这种情况时,table 将再次将该事件处理程序 添加到 到 select 元素,并将做同样的事情两次(或更多次)
因此,在分配事件之前我尝试使用
$('.selectpicker.call').off('change')
但是当我这样做时,我也删除了 bootstrap select选择器的事件处理程序
你们知道我可以使用的其他技巧来代替 jquery onchange 吗?
谢谢!
将此 $('.selectpicker.call').on('change',function(){....})
更改为 $('body').on('change'','.selectpicker.call',function(){....})
并仅加载此函数一次。
它所做的是将函数分配给 body
并在 .selectpicker.call
元素上触发 change
事件时触发。所以即使你的数据不断变化,这个函数也不会。
您可以使用 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>
我有一个问题希望你能帮助我:
我正在使用 bootstrap select选择器,它使用元素的 onchange 事件(我认为)
我需要向 select 元素添加另一个事件处理程序,我做了并且都工作正常,问题是随着我页面中的每个特定更改,我使用的 table 重新加载所有数据,当发生这种情况时,table 将再次将该事件处理程序 添加到 到 select 元素,并将做同样的事情两次(或更多次)
因此,在分配事件之前我尝试使用
$('.selectpicker.call').off('change')
但是当我这样做时,我也删除了 bootstrap select选择器的事件处理程序
你们知道我可以使用的其他技巧来代替 jquery onchange 吗?
谢谢!
将此 $('.selectpicker.call').on('change',function(){....})
更改为 $('body').on('change'','.selectpicker.call',function(){....})
并仅加载此函数一次。
它所做的是将函数分配给 body
并在 .selectpicker.call
元素上触发 change
事件时触发。所以即使你的数据不断变化,这个函数也不会。
您可以使用 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>