如何使用纯 Javascript 和文档查询选择器实现 jQuery .on() 函数

How to implement jQuery .on() function using plain Javascript and document query selectors

本文关键字:jQuery 实现 on 函数 选择器 查询 何使用 Javascript 文档      更新时间:2023-09-26

jquery on() 函数允许 DOM 事件在将来可能插入的元素上触发。如何使用纯Javascript来实现这一点,特别是在没有jQuery的具有特定类的元素上的mouseenter事件,并使用现代document.querySelector。

在这里

找到了答案 https://developer.mozilla.org/en-US/docs/Web/Events/mouseenter

对于任何对实现代码感兴趣的人,如下所示:

<ul id="test">
  <li>
    <ul class="enter-sensitive">
      <li>item 1-1</li>
      <li>item 1-2</li>
    </ul>
  </li>
  <li>
    <ul class="enter-sensitive">
      <li>item 2-1</li>
      <li>item 2-2</li>
    </ul>
  </li>
</ul>
<script>
  var delegationSelector = ".enter-sensitive";
  document.getElementById("test").addEventListener("mouseover", function( event ) {
    var target = event.target,
        related = event.relatedTarget,
        match;
    // search for a parent node matching the delegation selector
    while ( target && target != document && !( match = matches( target, delegationSelector ) ) ) {
        target = target.parentNode;
    }
    // exit if no matching node has been found
    if ( !match ) { return; }
    // loop through the parent of the related target to make sure that it's not a child of the target
    while ( related && related != target && related != document ) {
        related = related.parentNode;
    }
    // exit if this is the case
    if ( related == target ) { return; }
    // the "delegated mouseenter" handler can now be executed
    // change the color of the text
    target.style.color = "orange";
    // reset the color after a small amount of time
    setTimeout(function() {
        target.style.color = "";
    }, 500);

  }, false);

  // function used to check if a DOM element matches a given selector
  // the following code can be replaced by this IE8 compatible function: https://gist.github.com/2851541
  function matches( elem, selector ){
    // the matchesSelector is prefixed in most (if not all) browsers
    return elem.matchesSelector( selector );
  };
</script>