Calling onBlur and add DOM elements can cause onClick to not fire.

触发 input 的 blur 回调函数并动态添加DOM元素,可能会导致 button 的 click 函数不触发。

ezgif-3-fda2e047c9.gif

操作步骤:

  • 1、input 聚焦
  • 2、点击按钮

代码展示

<div id="targetDiv"></div>
<input type="text" id="myInput">
<button id="myButton">按钮</button>

DOM结构很简单, 我们看一下 js 代码

var input = document.getElementById("myInput");
    var targetDiv = document.getElementById("targetDiv");
    var button = document.getElementById("myButton");

    // 绑定blur事件处理函数
    input.addEventListener("blur", function() {
        // 创建新的复杂DOM结构
        var container = document.createElement("div");
        container.classList.add("container");

        var wrapper = document.createElement("div");
        wrapper.classList.add("wrapper");

        var section = document.createElement("section");
        section.classList.add("section");

        var header = document.createElement("h2");
        header.textContent = "New Content";

        var paragraph = document.createElement("p");
        paragraph.textContent = input.value;

        section.appendChild(header);
        section.appendChild(paragraph);

        wrapper.appendChild(section);

        container.appendChild(wrapper);

        // 将新的复杂DOM结构追加到目标div中
        targetDiv.appendChild(container);

    });

    // 添加点击事件处理函数
    button.addEventListener("click", function() {
        console.log("Button clicked!");
    });

1、结论分析:blur 事件优先级高于 click 函数触发,当 blur 回调函数内做了DOM的更新,引起了重绘,从而导致 ‘按钮’ 的位置发生改变,鼠标点上去的时候 点的那个位置已经没有按钮DOM存在了,所以 click 事件失效了

看到很多文章中提到类似的问题,单一的解释js是单线程, blur事件触发导致click事件未触发。这类的结论描述可能会给人产生误导。所以这里有必要给大家演示一下,并非js事件顺序执行导致的该现象。当我在代码中把 targetDiv 这个DOM节点放到Button下边,那一切的表现都是正常的 blur可以触发, 按钮的click事件也可以触发。从而证明了 ‘js是单线程, blur事件触发导致click事件未触发’ 该观点的错误性

2、论证:论证该结论的正确性

ezgif-5-1f64438be1.gif

在代码中添加已click的监听事件, 看一下当我们点击按钮的时候 实际点击的target是什么?
通过结果表现来看,当 blur 触发后,实际点击的位置并非 ‘按钮’ 而是body。从而论证 当点击的时候 按钮DOM的位置依然发生变化

3、解决方案:

  • 将 blur 回调函数延迟触发 包一层setTimeout
  • 将按钮的 click 事件替换成 onMouseDown
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JavaScript中Dom 1.基本概念 1.1 什么是window? window:是一个全局对象, 代表浏览...
    煤球快到碗里来阅读 1,748评论 0 0
  • Node. document节点 Element对象 属性的操作 Text节点和DocumentFragment节...
    Viaphlyn阅读 3,047评论 0 1
  • 一、注册事件-事件监听 给元素注册上事件语法:元素.addEventListener('事件', 要执行的函数)就...
    kc7阅读 903评论 0 0
  • DOM属性操作: attr()与prop()的区别: DOM操作: 获取或设置文本内容: text()与html(...
    风林山阅读 2,415评论 0 0
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 5,205评论 0 8