javascript - 为什么在 Jquery 中 "on click"只更新一次?然后第二次在 $(this) 上显示 "undefined"?

标签 javascript jquery

我只是在创建一个导航菜单,并有一个基本的无序列表,其中包含一个“子菜单”。这是 Jquery。 “事件”类和 if 语句的原因是,如果选择列表中的另一个项目,我希望 slider 保持打开状态,这样它就不会在每次迭代时关闭并再次打开。

代码中对我来说有问题的部分在这里。

$('.slider').html( $(this).find('ul') );

主要问题是 on('click',) 仅在第一次被点击时更新。第二次单击菜单中的另一个项目时,它不会使用新选择更新自身,因此不会显示新的子菜单列表?控制台日志显示它是未定义。不过应该是第一次吧?

我不明白为什么会这样或背后的原因!逻辑告诉我第一次发生的同样的事情应该继续发生,因此有效?!在我用我的额头在墙上打个洞之前,感谢您的帮助!

$(document).ready(function() {

    $('ul > li > ul').hide();
    $('.slider').hide();

    // Menu
    $('.menuNav > ul > li').on('click', function() {

        // if active
        if ( $(this).hasClass('active') ) {
            $(this).parents().children().removeClass('active');
            $('.slider').hide('slide', 200);
        }

        // if unactive
        else {
            $(this).addClass('active');
            $('.slider').show('slide', 200);
            $(this).siblings().removeClass('active');
            // Show related list
            $('.slider').html( $(this).find('ul') );

        }

    });
});

HTML

<div class="menuNav">
  <ul>

    <li><span>item_1</span>
      <div class="sub_position">
          <ul>
            <li>sub-item_1-1</li>
            <li>sub-item_1-2</li>
            <li>sub-item_1-3</li>
            <li>sub-item_1-4</li>
          </ul>
      </div>
    </li>

    <li><span>item_2</span>
        <div class="sub_position">

      <ul>
        <li>sub-item_2-1</li>
        <li>sub-item_2-2</li>
        <li>sub-item_2-3</li>
        <li>sub-item_2-4</li>
      </ul>
      </div>
    </li>

....等等

  </ul>
</div>

最佳答案

您的问题可能是因为您实际上将整个子菜单移到了 .slider 中。 , 而不是克隆它。这意味着子菜单会在第一次点击时从原来的菜单中移除,再次点击则意味着嵌套的子菜单选择器$(this).find('ul')将返回一个空集。

为避免此问题,我建议您执行以下操作:

  • 将子菜单的 outerHTML 附加到 slider ,即 $(this).find('ul')[0].outerHTML
  • 如果您想在完成后隐藏菜单中的子菜单,只需在适当的时候隐藏/取消隐藏它即可。

您可以随时使用 $(this).find('ul').html()为了同样的效果,但请记住 <li>元素必须是 <ul> 的直接子元素.因此,我们还需要克隆 outerHTML(即复制 <ul>)以确保将有效的 HTML 注入(inject) slider 。

$(document).ready(function() {

  $('ul > li > ul').hide();
  $('.slider').hide();

  // Menu
  $('.menuNav > ul > li').on('click', function() {

    // if active
    if ($(this).hasClass('active')) {
      $(this).parents().children().removeClass('active');
      $('.slider').hide('slide', 200);
    }

    // if unactive
    else {
      $(this).addClass('active');
      $('.slider').show('slide', 200);
      $(this).siblings().removeClass('active');
      // Show related list (changed: now we use HTML's native outerHTML object
      $('.slider').html($(this).find('ul')[0].outerHTML);

    }

  });
});
.slider {
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<div class="slider"></div>
<div class="menuNav">
  <ul>

    <li><span>item_1</span>
      <div class="sub_position">
        <ul>
          <li>sub-item_1-1</li>
          <li>sub-item_1-2</li>
          <li>sub-item_1-3</li>
          <li>sub-item_1-4</li>
        </ul>
      </div>
    </li>

    <li><span>item_2</span>
      <div class="sub_position">

        <ul>
          <li>sub-item_2-1</li>
          <li>sub-item_2-2</li>
          <li>sub-item_2-3</li>
          <li>sub-item_2-4</li>
        </ul>
      </div>
    </li>
  </ul>
</div>

关于javascript - 为什么在 Jquery 中 "on click"只更新一次?然后第二次在 $(this) 上显示 "undefined"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537318/

相关文章:

javascript - 在 react native 中,子组件和父组件之间进行通信以更改父组件中的 View 内容的正确方法是什么?

javascript - 从类方法调用中抽象出 for-of 循​​环

javascript - 使用 vuetify 2 v-file-input 和 axios 上传文件

javascript - jquery 幸运轮得到错误的结果

javascript - 设置选定的选项 JQuery

javascript - Phonegap Jquery Mobile 将数据保存到手机

javascript - 为什么我的 CSS 不适用于我的 javascript 元素?

javascript - 无法将对象值从 javascript 传递到 Controller

jquery - 如何使用ajax提交drupal表单?

javascript - jQuery 在动画期间使用 if-else