javascript - 如何在 body 的输入元素上委托(delegate) 'change' 事件?

标签 javascript event-handling dom-events event-delegation

我已经知道 jQuery 的事件委托(delegate)。 但是,如果没有 jQuery,我如何使用纯 Javascript 做同样的事情。

虽然我在 body 或顶部元素 (div) 上附加了 change 事件,但是当 body 或顶部元素中的 input 元素的值更改时,不会触发 change 事件。 ..

我该怎么做?

最佳答案

您可以只监听一个元素上的事件(在本例中为 elSelector),然后仅当实际目标适合该元素中的 selector 时才执行该事件。

function on(elSelector, eventName, selector, fn) {
    var element = document.querySelector(elSelector);

    element.addEventListener(eventName, function(event) {
        var possibleTargets = element.querySelectorAll(selector);
        var target = event.target;

        for (var i = 0, l = possibleTargets.length; i < l; i++) {
            var el = target;
            var p = possibleTargets[i];

            while(el && el !== element) {
                if (el === p) {
                    return fn.call(p, event);
                }

                el = el.parentNode;
            }
        }
    });
}

在下面的示例中,您可以看到它也适用于动态元素!

on("#inputs", "change", ".event", (target, evt) => console.log(target.target));




function on(elSelector, eventName, selector, fn) {
  var element = document.querySelector(elSelector);

  element.addEventListener(eventName, function(event) {
    var possibleTargets = element.querySelectorAll(selector);
    var target = event.target;

    for (var i = 0, l = possibleTargets.length; i < l; i++) {
      var el = target;
      var p = possibleTargets[i];

      while (el && el !== element) {
        if (el === p) {
          return fn.call(p, event);
        }

        el = el.parentNode;
      }
    }
  });
}

/** random code for the button to add more inputs **/

let i = 7;

document.querySelector("#b").addEventListener("click", () => {
  document.querySelector("#inputs").innerHTML += i + ` <input type="text" class="event"> <br>`;
  i++;
});
<div id="inputs">
  1 <input type="text" class="event"> <br>
  2 <input type="text" class=""> <br>
  3 <input type="text" class="event"> <br>
  4 <input type="text" class=""> <br>
  5 <input type="text" class="event"> <br>
  6 <input type="text" class=""> <br>
</div>

<br><br>
<button id="b">Add another input</button>

关于javascript - 如何在 body 的输入元素上委托(delegate) 'change' 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51419014/

相关文章:

javascript - window.onblur 事件在使用 IE8 时也会触发 window.onfocus 事件

javascript - ajax请求中修改的变量在执行后不可见

c# - 扩展 Wpf MouseButtonEventArgs 以启用自定义参数

javascript - 如何监视隐藏输入元素的值?

javascript - 同位素图像重叠

c# - 属性更改后何时调用方法

jquery-mobile - jQuery Mobile中的对话框关闭事件

JavaScript 在点击时获取 anchor href

javascript - 检索索引 ul li 列表

javascript - ajax 文件上传问题(Node.js、express、jQuery)