【问题标题】:How to detect if clicked element was not a child of an element in jQuery?如何检测单击的元素是否不是jQuery中元素的子元素?
【发布时间】:2018-08-11 13:40:18
【问题描述】:

我在 WordPress 中有一个嵌套列表,点击它会相应地过滤产品。

这就是代码的样子:

<ul class="woof_list woof_list_radio">

  <li class="woof_term_224">
    <label class="woof_radio_label " for="woof_unselect">Parent Category 1</label>

    <ul class="woof_childs_list woof_childs_list_224">
      <li class="woof_childs_list_li">
        <label class="woof_radio_label">Sub Category 1</label>
      </li>
    </ul>
  </li>

  <br>

  <li class="woof_term_225">
    <label class="woof_radio_label " for="woof_unselect">>Parent Category 2</label>

    <ul class="woof_childs_list woof_childs_list_225">
      <li class="woof_childs_list_li">
        <label class="woof_radio_label">Sub Category 2</label>
      </li>
    </ul>
  </li>

  <br>

  <li class="woof_term_226">
    <label class="woof_radio_label " for="woof_unselect">>Parent Category 3</label>

    <ul class="woof_childs_list woof_childs_list_226">
      <li class="woof_childs_list_li">
        <label class="woof_radio_label">Sub Category 3</label>
      </li>
    </ul>

  </li>

</ul>

• 父类别 1
o 子类别 1
• 家长类别 2
o 子类别 2
• 家长类别 3
o 子类别 3

我有被点击元素的选择器。

j(document).on('click', '.woof_list_radio .woof_radio_label', function(e) {

});

如果我单击子类别 1 &lt;label&gt; 元素,它是 &lt;li class="woof_term_224"&gt; 的子元素,然后我单击父类别 2 &lt;label&gt; 元素,您知道如何检测单击的 &lt;label&gt; 是否不是&lt;li class="woof_term_224"&gt; 或检测到它在其父级之外被点击?

【问题讨论】:

    标签: javascript php jquery html wordpress


    【解决方案1】:

    您可以检查与woof_term_224 类最接近的长度以确定这一点。您可以通过将选择器更改为:

    $(document).on('click', '.woof_list_radio > [class^=woof_term_]', function(e) {
    

    代码示例:

    $(document).on('click', '.woof_list_radio > [class^=woof_term_]', function(e) {
      let len = $(this).closest('.woof_term_224').length;
      if(len)
        console.log('The child');
      else
        console.log('Not the child');
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="woof_list woof_list_radio">
    
      <li class="woof_term_224">
        <label class="woof_radio_label " for="woof_unselect">Parent Category 1</label>
    
        <ul class="woof_childs_list woof_childs_list_224">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 1</label>
          </li>
        </ul>
      </li>
    
      <br>
    
      <li class="woof_term_225">
        <label class="woof_radio_label " for="woof_unselect">>Parent Category 2</label>
    
        <ul class="woof_childs_list woof_childs_list_225">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 2</label>
          </li>
        </ul>
      </li>
    
      <br>
    
      <li class="woof_term_226">
        <label class="woof_radio_label " for="woof_unselect">>Parent Category 3</label>
    
        <ul class="woof_childs_list woof_childs_list_226">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 3</label>
          </li>
        </ul>
    
      </li>
    
    </ul>

    可以通过以下方式找到被点击元素的父类:

    $(document).on('click', '.woof_list_radio > [class^=woof_term_]', function(e) {
      let parentClass = $(this).closest('[class^=woof_term_').prop('class');
      console.log('Element is the child of class',parentClass);
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="woof_list woof_list_radio">
    
      <li class="woof_term_224">
        <label class="woof_radio_label " for="woof_unselect">Parent Category 1</label>
    
        <ul class="woof_childs_list woof_childs_list_224">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 1</label>
          </li>
        </ul>
      </li>
    
      <br>
    
      <li class="woof_term_225">
        <label class="woof_radio_label " for="woof_unselect">>Parent Category 2</label>
    
        <ul class="woof_childs_list woof_childs_list_225">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 2</label>
          </li>
        </ul>
      </li>
    
      <br>
    
      <li class="woof_term_226">
        <label class="woof_radio_label " for="woof_unselect">>Parent Category 3</label>
    
        <ul class="woof_childs_list woof_childs_list_226">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 3</label>
          </li>
        </ul>
    
      </li>
    
    </ul>

    【讨论】:

    • 嗨。感谢您的快速回复。你能更新你的代码,让它不限于 woof_term_224 吗?
    • @ConanCarroll,那么您要查找哪个父元素?
    • 嗯.. 默认情况下,当我单击
    • @ConanCarroll,虽然我不太确定确切的要求,但我添加了另一个解决方案.....请检查。
    【解决方案2】:

    您可以检查目标元素(被点击的元素).matches 是否为.woof_term_224 的后代的选择器字符串:

    $(document).on('click', '.woof_list_radio .woof_radio_label', ({ target }) => {
      if (target.matches('.woof_term_224 *')) console.log('Clicked on child of 224')
      else console.log('Clicked on something outside of 224');
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="woof_list woof_list_radio">
    
      <li class="woof_term_224">
        <label class="woof_radio_label " for="woof_unselect">Parent Category 1</label>
    
        <ul class="woof_childs_list woof_childs_list_224">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 1</label>
          </li>
        </ul>
      </li>
    
      <br>
    
      <li class="woof_term_225">
        <label class="woof_radio_label " for="woof_unselect">>Parent Category 2</label>
    
        <ul class="woof_childs_list woof_childs_list_225">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 2</label>
          </li>
        </ul>
      </li>
    
      <br>
    
      <li class="woof_term_226">
        <label class="woof_radio_label " for="woof_unselect">>Parent Category 3</label>
    
        <ul class="woof_childs_list woof_childs_list_226">
          <li class="woof_childs_list_li">
            <label class="woof_radio_label">Sub Category 3</label>
          </li>
        </ul>
    
      </li>
    
    </ul>

    【讨论】:

    • 您能否编辑您的代码,使其灵活,而不仅仅是类 woof_term_224?就像它在其父级之外被点击一样
    • 我不太明白,监听器正在监听.woof_radio_label 的点击,而这些元素必然是它们woof_term_### 祖先的子元素,对吧?你能详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2010-09-26
    • 2019-02-12
    • 2012-09-08
    • 2020-02-21
    • 2022-12-16
    • 1970-01-01
    相关资源
    最近更新 更多