Javascript 点击打开和关闭菜单,不使用 jquery

Javascript click to open and close menu, NOT using jquery

我想要一个菜单​​,我可以点击打开,点击关闭。 类似于悬停菜单,但具有单击打开和单击关闭的功能。 我有三个可见的列表项,子菜单在下面。

这些隐藏在 css、display:none 中。 我可以使用关键字 "this" 和用于检查是否有超过 1 个项目的 for 循环来显示它们,然后在单击时打开列表。

就我对这段代码的理解而言,我早些时候在这里得到了一些帮助。 现在我已经阅读并观看了 buckysroom 的教程,并且感觉我了解了很多,至少关于数组,以及代码中的所有内容,我现在至少可以理解。我现在有这个代码。

function showMenu(parentElement){
    var uls= parentElement.getElementsByTagName("ul");
    if (uls.length > 0)
        uls[0].setAttribute("style","display: block");

 }

function load(){ 
    var lis = document.getElementsByTagName("li"); 
    for (var i = 0; i < lis.length; i++) {
        lis[i].addEventListener("click", function(){
            showMenu(this);
        }); 
    }
}

据我了解,最后,'for' 循环,我看到这段代码打开任何数组,或者类似的任何 'li' 具有超过 1 个( [0] )项,如0在数组中为1,循环遍历看是否有children。如果是,则打开 'this' 'li's' 'ul'.

自加载函数以来,包含了 showMenu 函数,我学到了一点,在函数内部使用函数,而不是复制自己,使用数组和变量,并以某种方式将它们分配给彼此。 Buckysroom 教程,至少帮助我理解了很多。

现在.. 我的问题是我对 Javascript 的了解还不够多,无法解决这个问题,我宁愿不使用 jQuery,而是了解如何使用简单的 Javascript.[=19 来实现这一点=]

任何指点都会有很大帮助,我尝试了以下方法;

将唯一 ID 添加到我的三个 ul,所以我知道实际上可以使用上面的代码打开它们,并且我可以关闭它们,使用另一个代码,将其设置回 "display:none"。

然后的问题是,我没有机会再次打开它们,而且我知道我缺少一些部分,例如 stopPropagation 或者可能使用 addEventListener - Click,对于第二部分。正如您所理解的,addeventListener 是我从此处的代码中获得的。

 function Meny1(){

    var unorderedList = document.getElementById("ul_1");

            var lis = unorderedList.getElementsByTagName("li");
            for (var i = 0; i < lis.length; i++) {

            lis[i].setAttribute("style","display: none");

            }
}

我想通了,我可以用数字指定每个 menu-item,例如 [23],而不是 [i],以定位单个菜单项,像这样复制该行:

lis[23].setAttribute("style","display: none");
lis[24].setAttribute("style","display: none");

但据我所知,这是一种不好的做法,因为如果我要添加另一个菜单项或删除一个菜单项会很糟糕,而且很多 copy-coding..

我的想法是,我想要这样的东西: html:

<div id ="cssmenu"></div>
<ul id="ul_1"><li>I have many li's in each 'ul'</li></ul>
<ul id="ul_2"><li>I have many li's in each 'ul'</li></ul>
<ul id="ul_3"><li>I have many li's in each 'ul'</li></ul>

css:

#cssmenu{display:block;}
#cssmenu ul li ul{display:none}

我认为 js 应该如何,但我不使用 类: (我没有这样做,因为 w3c 验证器指出我不应该这样做)。

function showAndCloseMenu1(){
var ul_1 = document.getElementbyId("ul_1");
    if(mouseclicked on ul_2 || mouseclicked on ul_3){
        close.ul_1(this)
    }
        if(mouseClicked ul_1){
         style.display = "block";
        }
}

然后 ul_2 和 ul_3 自然也是如此,我还没有足够好地考虑将所有代码实现到一个代码中,但我知道这当然是可能的,全局变量,并通过使用属性。

有谁能帮我解决这个问题吗?

我尝试使用 jQuery,但没有成功,正如我所说,宁愿不用,因为我渴望最大限度地学习 Javascript!我可以阅读 Javascript,jQuery 对我来说只是一堆美元符号,里面有简化的 Javascript。

http://fiddle.jshell.net/ufcsccy3/

这是一个 fiddle,但是菜单不像在浏览器中那样工作,但是如果你看那里你就会明白,它是左边的菜单。

如何在我的 Javascript 导航中拥有 show/hide 功能? 正如我所见,我在这里思考的路径是否正确,类 没什么区别,但也许可以为我节省一些编码 space。

感谢您对此提供的任何帮助,我似乎无法解决这个问题! 我希望它像我第一次单击 ul_1 时那样打开。如果我再次单击它,我希望它关闭。 如果 ul_1 打开,我单击 ul_2,或 ul_3,我想打开那个,然后再次关闭 ul_1,在我看来有点标准菜单导航。

只需为打开的菜单切换一个 ID。一种方法,onclick,可以做到这一切。

function showmenu(elem) {
  // Clear any currently open menu
  var openMenu = document.getElementById("activeMenu");
  if (openMenu) {
    openMenu.removeAttribute("id");
    // Stop if we're just closing the current menu
    if (openMenu === elem) {
      return;
    }
  }

  // Only apply it if the element actually has LI child nodes.
  // OPTIONAL: Will still work without if statement.
  if (elem.getElementsByTagName("li").length > 0) {
    elem.setAttribute("id", "activeMenu");
  }
}
ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
ul li {
  float: left;
  padding: 0 10px;
}
ul ul {
  display: none;
}
ul ul li {
  float: none;
}
#activeMenu ul {
  display: block;
}
<ul>
  <li onclick="showmenu(this)">Menu Item 1</li>
  <li onclick="showmenu(this)">Drop Down 1
    <ul>
      <li>DD1 Item 1</li>
      <li>DD1 Item 2</li>
    </ul>
  </li>
  <li onclick="showmenu(this)">Drop Down 2
    <ul>
      <li>DD2 Item 1</li>
      <li>DD2 Item 2</li>
    </ul>
  </li>
</ul>

请注意,我使用 onclick 只是为了简单起见。添加您所做的点击事件是正确的方法。

function showMenu(elem) {
      // Clear any currently open menu
      var openMenu = document.getElementById("activeMenu");
  if (openMenu) {
        openMenu.removeAttribute("id");
        // Stop if we're just closing the current menu
        if (openMenu === elem) {
          return;
    }
  }

      // Only apply it if the element actually has LI child nodes.
      // OPTIONAL: Will still work without if statement.
      if (elem.getElementsByTagName("ul").length > 0) {
        elem.setAttribute("id", "activeMenu");
      }
    }

        function showSubMenu(elem) {
      // Clear any currently open menu
          var openMenu = document.getElementById("activeMenu");
      if (openMenu)
        openMenu.removeAttribute("id");
      var openSubMenu = document.getElementById("activeSubMenu");
      if (openSubMenu) {
        openSubMenu.removeAttribute("id");
        // Stop if we're just closing the current menu

      }

      // Only apply it if the element actually has LI child nodes.
      // OPTIONAL: Will still work without if statement.
      if (elem.getElementsByTagName("ul").length > 0) {
        elem.setAttribute("id", "activeSubMenu");
      }
    }
        function showLastSubMenu(elem) {
      // Clear any currently open menu
          var openMenu = document.getElementById("activeMenu");
      if (openMenu)
        openMenu.removeAttribute("id");
      var openSubMenu = document.getElementById("activeSubMenu");
      if (openSubMenu) 
        openSubMenu.removeAttribute("id");
        // Stop if we're just closing the current menu
    var openLastSubMenu = document.getElementById("activeSubMenu");
      if (openLastSubMenu) {
        openLastSubMenu.removeAttribute("id");

}
      // Only apply it if the element actually has LI child nodes.
      // OPTIONAL: Will still work without if statement.
      if (elem.getElementsByTagName("ul").length > 0) {
        elem.setAttribute("id", "activeLastSubMenu");
      }
    }

我 post 完整的代码,在@David 的帮助下得到了一个可点击的菜单解决方案,非常感谢 :)

css 项#someMenu ul、#somemenu ul li 和#someMenu ul ul 必须更改为 类,因此 .someMenu ul 等。 #activeMenu > ul { 显示:块; }

#activeSubMenu > ul {
  display: block;
}
#activeLastSubMenu > ul {

  display: block;
}  

并且在 html、

<nav id ="someMenu" class="someMenu">
function showMenu on the first level li's, 
function showSubMenu for next level
function showLastSubMenu for the last sub's (I had max 3 levels)

很多重复,所以我会尝试用数组和 addEventListener 把它变成更少的代码,正如你在回答中所说的那样更正确!