jquery的.on如何对每个元素只触发一次?

$("#aaa").on("input propertychange","input", function() {
    
});

如何对每个input元素(包括后面生成的input)只触发一次?
阅读 3.5k
5 个回答
  1. 首先,在这个需求里,每个input可能会出现状态不一致的情况(有的是“已触发”,而有的是“未触发”),所以这种情况下,要么把事件分别绑定到各个input上(即放弃事件代理),要么仍然保留代理,但给每个input都设置一个状态指示(推荐使用data-*自定义属性,jQ有现成的API可以支持)
  2. 绑定到各个input上的方案,可以用.one()来绑定事件;或者使用.on(),然后在回调里用$(this)+.off()掉这个事件就行了。当然嫌事件名太长的话,可以加命名空间
  3. 以上注意新生成的input里需要再绑一遍事件,当然可以把回调写成具名函数,这样绑起来相对简you单ya些。
  4. 如果仍然坚持代理方案,那就需要在每个input上都加个状态变量了,即在回调里加入类似$(this).data('do')这样的语句,执行前判断一下它的值,如果执行过就直接跳出回调就好了。

使用.one

$("#aaa").one("input propertychange","input", function() {
    
});
var b=0
$("#aaa").on("input propertychange","input", function() {

if(b==1)
{
}
else
{
//你的代码
b=1
}
    
});

那你只有自己记录哪些节点被点过了,使用 .one 肯定不行。

$("#aaa").on("input propertychange", "input", function(event) {
  if (event.target.classList.contains('clicked')) {
    return;
  }
  event.target.classList.add('clicked');

  // do what you need to do
});

.off() 解绑,在触发后 在内部把触发元素的事件解绑 就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题