jquery - 如何替换已弃用的 .context jquery?

标签 jquery deprecated

我遇到菜单系统问题。我发现使用已弃用的 jQuery 上下文选择器可能存在问题,但我不可能理解这段代码并尝试修复它。

我见过this thread谈论它,但由于我不是 jQuery 用户,我没有设法使这个答案适应我的情况。任何帮助将不胜感激!

这是与我的问题相关的 jQuery 代码。该菜单用于打开/关闭子菜单、子子菜单、子子子菜单等。

$(document).ready(function() {
  $('i.idi').click(function(e) {
    event.stopPropagation();    
    var submenu2 = $(e.target).closest('ul').children('ul li ul.sub-menu');
    var sub = submenu2.context.nextElementSibling;
    var submenu = $(e.target).closest('li').children('ul.sub-menu');
    
    for (let i = 0; i < submenu.length; i++) {
      if (sub.classList.contains("hidden")) {
        var submenu1 = document.querySelectorAll('ul li ul');
        for (let i = 0; i < submenu1.length; i++) {
          if (submenu1[i].classList.contains("hidden")) {} else {
            submenu1[i].classList.remove("block");
            submenu1[i].classList.add("hidden");
          }
        }
        sub.classList.remove("hidden");
        sub.classList.add("block");
      } else {
        var submenu1 = document.querySelectorAll('ul li ul');
        for (let i = 0; i < submenu1.length; i++) {
          if (submenu1[i].classList.contains("hidden")) {} else {
            submenu1[i].classList.remove("block");
            submenu1[i].classList.add("hidden");
          }
        }

        sub.classList.remove("block");
        sub.classList.add("hidden");
      }
    }
  });
});

这是html代码

    <nav>
        <ul>
              <li>
                  <a href="">
                      <i class="material-icons idi">home</i>
                  </a>
              </li>
                  <li>
                      <a href="" class="mparent">
                          Default
                      </a>
                      <i class="material-icons idi">keyboard_arrow_down</i>
                      <ul class="sub-menu hidden">
                          <li><a href="">
                                  test subcat
                              </a>                      
                          </li>
                      </ul> 
            </li>
        </ul>
    </nav>

 <nav>
    <ul>
       <li>
          <a href="">
              <i class="material-icons idi">home</i>
          </a>
       </li>
       <li>
           <a href="" class="mparent">
              Default
           </a>
           <i class="material-icons idi">keyboard_arrow_down</i>
             <ul class="sub-menu hidden">
                 <li><a href="">
                              test subcat
                      </a>                      
                </li>
            </ul> 
        </li>
    </ul>
</nav>

这是可以使用的CSS代码。

.sub-menu.hidden {
    display: none;
}
.sub-menu.block {
    display: block;
}

最佳答案

您可以删除 submenu2 中的红鲱鱼并使用:

var sub = $(e.target)[0].nextElementSibling;

代码,提供的html和经过上述调整的js,使用jquery 3.3.1(最新的代码片段):

$(document).ready(function() {
  $('i.idi').click(function(e) {
    event.stopPropagation();
    var sub = $(e.target)[0].nextElementSibling;
    var submenu = $(e.target).closest('li').children('ul.sub-menu');

    for (let i = 0; i < submenu.length; i++) {
      if (sub.classList.contains("hidden")) {
        var submenu1 = document.querySelectorAll('ul li ul');
        for (let i = 0; i < submenu1.length; i++) {
          if (submenu1[i].classList.contains("hidden")) {} else {
            submenu1[i].classList.remove("block");
            submenu1[i].classList.add("hidden");
          }
        }
        sub.classList.remove("hidden");
        sub.classList.add("block");
      } else {
        var submenu1 = document.querySelectorAll('ul li ul');
        for (let i = 0; i < submenu1.length; i++) {
          if (submenu1[i].classList.contains("hidden")) {} else {
            submenu1[i].classList.remove("block");
            submenu1[i].classList.add("hidden");
          }
        }

        sub.classList.remove("block");
        sub.classList.add("hidden");
      }
    }
  });
});
.sub-menu.hidden {
  display: none;
}

.sub-menu.block {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav>
  <ul>
    <li>
      <a href="">
        <i class="material-icons idi">home</i>
      </a>
    </li>
    <li>
      <a href="" class="mparent">Default</a>
      <i class="material-icons idi">keyboard_arrow_down</i>
      <ul class="sub-menu hidden">
        <li><a href="">test subcat</a>
        </li>
      </ul>
    </li>
  </ul>
</nav>

关于jquery - 如何替换已弃用的 .context jquery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69723903/

相关文章:

javascript - 使用 jQuery 将 HTML 字符串转换为 DOM 对象

c# - 如何将一个类标记为已弃用?

java - LWJGL:glMatrixMode() 是否已弃用?或者我错过了什么?

objective-c - 替换已弃用的 sizeWithFont : in iOS 7?

java - Spring Security 已弃用 @AuthenticationPrincipal

javascript - jQuery .on() 和 .delegate() 在 iPad 上不起作用

javascript - 在 Javascript 中使用 Django JSON 响应对象

javascript - 当 div 被填充/可见时触发事件

jquery - Bootstrap多选: close dropdown for each checkbox selection

python - scikit-learn GaussianProcessRegressor vs GaussianProcess?为什么 GaussianProcess 在 0.18 版本中被弃用?