Auc的个人博客

vuePress-theme-reco Auc    2020 - 2021
Auc的个人博客 Auc的个人博客

选择一个主题吧~

  • 暗黑
  • 自动
  • 明亮
主页
分类
  • JavaScript
  • Vue
  • 数据结构与算法
  • 文档
  • 面试题
  • 笔记
标签
笔记
  • CSS
  • ES6
  • JavaScript
  • Vue
  • C语言
文档
  • Vueのapi
  • Vue Router
  • axios
  • Vue CLI
面试
  • JS
  • Vue
  • 基础
时间线
联系我
  • GitHub (opens new window)
author-avatar

Auc

62

文章

11

标签

主页
分类
  • JavaScript
  • Vue
  • 数据结构与算法
  • 文档
  • 面试题
  • 笔记
标签
笔记
  • CSS
  • ES6
  • JavaScript
  • Vue
  • C语言
文档
  • Vueのapi
  • Vue Router
  • axios
  • Vue CLI
面试
  • JS
  • Vue
  • 基础
时间线
联系我
  • GitHub (opens new window)
  • JavaScritpt

    • 变量的基本类型
    • blur 与 click 冲突
    • 移动端点击穿透
    • 数组快速排序算法 JavaScript 实现

blur 与 click 冲突

vuePress-theme-reco Auc    2020 - 2021

blur 与 click 冲突

Auc 2020-01-18 一些坑JavaScript

# blur 与 click 冲突

# 问题引入

  1. 一个搜索框一个按钮
  2. 给搜索框注册 blur 事件,给按钮注册 click 事件
  3. 使 input 获得焦点后点击按钮
  4. 这时 blur 与 click 事件冲突
<body>
  <Input placeholder="请输入用户名" id="input"></Input>
  <button id="btn">提交</button>
  <script>
    const input = document.getElementById('input');
    const btn = document.getElementById('btn');
    input.addEventListener('blur', function() {
      console.log('input 框 blur 事件触发');
    });
    btn.addEventListener('click', function() {
      console.log('button 的 click 事件触发');
    });
  </script>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
结果:

分析

  1. JavaScript 为单线程,同一时间只能执行处理一个事件
  2. blur 事件要优先于 click 事件率先触发
  3. 如果 blur 有隐藏或者删除节点的逻辑,比如删除掉 button 这时 click 事件便无法触发,发生冲突

# 解决

# 方案一:使用延时器

给 blur 事件函数添加延时器,使之延时在 click 事件后执行。

input.addEventListener('blur', function () {
  setTimeout(function () {
    console.log('input 框 blur 事件触发');
  }, 500);
});
1
2
3
4
5

结果:

# 方案二

使用 mousedown 事件替换 click 使鼠标按下事件率先执行

btn.addEventListener('mousedown', function () {
  console.log('button 的 mousedown 事件触发');
});
1
2
3

结果:

鼠标 DOM 操作

onclick onmousedown onmouseup 触发顺序:

  1. 当鼠标按钮被点击时,onmousedown 事件被触发;
  2. 然后当鼠标按钮被释放时,onmouseup 事件被触发;
  3. 最后,当鼠标点击完成后,onclick 事件被触发。

其他:

  1. onmouseover 事件将鼠标移入 HTML 元素上触发;
  2. onmouseout 事件鼠标移出时触发。