代码之家  ›  专栏  ›  技术社区  ›  Álvaro González

使用:not()筛选事件处理程序中的元素

  •  4
  • Álvaro González  · 技术社区  · 5 年前

    我对这件事感到很困惑 :not() selector

    section { /* Overriden as expected */
      color: red;
    }
    input {
      color: green; /* In effect as expected */
    }
    :not(input) {
      color: blue; /* In effect as expected */
    }
    <section>
      <p>Lorem ipsum</p>
      <input value="Lorem ipsum">
    </section>

    jQuery(function($){
      $(document).on("keydown", "input", function(event){
        // This fires only for <input> as expected
        console.log("Event handler #1 on", event.target);
      });  
    
      $(document).on("keydown", ":not(input)", function(event){
        // This fires for *all* elements :-?
        console.log("Event handler #2 on", event.target);
        // ... even though these checks return the results that intuition suggests
        console.log('Is "input"? %s; Is ":not(input)"? %s',
          $(event.target).is("input"),
          $(event.target).is(":not(input)")
        );
      });
    
      $(document).on("keydown", "section :not(input)", function(event){
        // This *never* fires :-?
        console.log("Event handler #3 on", event.target);
      });
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <section>
      <p>Click and type here</p>
      <input value="Click and type here">
    </section>

    这条路背后的理由是什么 在这里工作?

    我真的在寻找一个解释,而不是修复。

    1 回复  |  直到 5 年前
        1
  •  5
  •   CertainPerformance    5 年前

    问题是 keydown 事件 泡沫 input :not(input) ,处理程序将不会在事件刚在 元素,但它 section 元素。你可以通过检查 this event.target 总是 成为

    jQuery(function($){
      $(document).on("keydown", ":not(input)", function(event){
        // This fires for *all* elements :-?
        console.log("Event handler #2 on", this);
      });
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <section>
      <p>Click and type here</p>
      <input value="Click and type here">
    </section>

    如果您继续添加 :not

    jQuery(function($){
      $(document).on("keydown", ":not(input):not(section):not(body)", function(event){
        // This fires for *all* elements :-?
        console.log("Event handler #2 on", this);
      });
    });
    <<第节>
    <p>单击并在此处键入</p>
    </第节>

    我想你 能够 :not(input):not(section):not(body):not(html) ,但这有点愚蠢,很难管理。

    您的第三个处理程序正确地排除了 输入 从发射事件开始,但是 只有 输入 (和类似的)火元素 事件-它不能从 <section> 例如如果有一个 部分

    $(document).on("keydown", "section :not(input)", function(event) {
      console.log("Event handler #3 on", event.target);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <section>
      <p>Click and type here</p>
      <input value="Click and type here">
      <textarea></textarea>
    </section>