[实战]input失焦事件先于点击事件发生时怎么办?

例子:

看上面这个例子,我们的需求是:
点击备注表格时,该表格变为可编辑状态的输入框,会出现输入框、两个按钮。
点击对勾时,会修改备注发送给后端修改请求,修改备注,变为不编辑状态,输入框、按钮消失。
失去焦点时,输入框同样变为不可编辑状态,输入框、按钮消失。

问题的关键在于,input失焦事件总是先于对勾按钮的点击事件发生的。即当我们点击按钮对勾时,已经先失去了焦点,将按钮隐藏了。因此根本不可能触发按钮的点击事件。

那么这个问题怎么解决呢?一个常用的做法是,将input输入框的失焦事件onblur的回调里设置一个定时器setTimeout,在定时器里面执行将按钮隐藏的操作。

// 失焦事件的回调
onBlurHandler() {
	// 设置定时器
    this.timeoutId = setTimeout(() => {
    	// 关闭可编辑状态
        this.isEdit = false;
    },100);
}

另外,如果我们不想在点击确定时隐藏按钮。我们在按钮的点击事件的回调里可以先清除这个定时器。

// 对勾按钮的点击事件
confirmEdit() {
	// 清除定时器
    clearTimeout(this.timeoutId);
    // 触发发送更改备注的请求的事件
    this.$emit('subValue', this.valueInput)
},

之所以这么做的原因是,这是一个异步的操作,setTimeout作为一个宏任务将会在同步任务执行完之后才会被执行。
有关宏任务微任务的概念及原理,下面这篇文章讲的比较易懂,看完之后你就都明白了。
https://juejin.im/post/59e85eebf265da430d571f89

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要解决点保存按钮先触发点事件再触发input事件的问题,可以通过以下两种方式来解决: 1. 使用setTimeout延迟事件: 首先,在点保存按钮,触发点事件的同,使用setTimeout函数来延迟一段间触发事件。这样,在点事件触发后,等待一段间后才会触发事件,确保点事件先于事件执行。例如: ```javascript document.querySelector('#saveButton').addEventListener('click', function() { // 点事件处理逻辑 setTimeout(function() { // 事件处理逻辑 }, 100); }); ``` 在上述代码中,使用setTimeout函数来延迟100毫秒后执行事件处理逻辑,确保点事件先于事件执行。 2. 使用事件捕获阶段和事件委托: 可以通过在包含保存按钮和输入框的父元素上添加事件监听,使用事件捕获阶段来先捕获点事件,再根据事件目标元素进行判断是否触发事件。这样可以确保点事件先于事件执行。例如: ```javascript document.querySelector('#parentElement').addEventListener('click', function(event) { if (event.target.id === 'saveButton') { // 点事件处理逻辑 } else if (event.target.id === 'inputElement') { // 事件处理逻辑 } }, true); ``` 在上述代码中,通过在父元素上添加事件监听,并设置事件捕获阶段为true,可以先捕获到点事件。然后根据事件目标元素的id判断是点按钮还是输入框,从而执行相应的事件处理逻辑。这样可以确保点事件先于事件执行。 以上是两种解决点保存先触发点事件再触发input事件的方法,可以根据具体情况选择适合的方式解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值