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

2024-04-15

我想要一个菜单​​,可以单击打开,然后单击关闭。 与悬停菜单类似,但需要单击、打开和单击关闭。 我有三个可见的列表项,下面有子菜单。

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

据我理解这段代码,我之前在这里得到了一些帮助。 现在我已经阅读并观看了 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”循环中,我看到这段代码打开了任何数组,或者像任何具有超过 1 个 ( [0] ) 项的“li”,因为 0 在数组中是 1,并循环遍历看看它是否有孩子。如果是,它会打开“this”“li”“ul”。

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

现在.. 我的问题是我对 Javascript 的了解不够多,无法理解这一点,而且我宁愿不使用 jQuery,而是了解如何使用纯 Javascript 来实现这一点。

任何指示都会有很大帮助,我已经尝试过以下方法;

将唯一的 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");

            }
}

我发现,我可以用数字指定每个菜单项,例如 [23],而不是 [i],以定位单个菜单项,复制该行,如下所示:

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

但据我了解,这是一种不好的做法,因为如果我要添加另一个菜单项或删除一个菜单项,那就太糟糕了,而且也是大量复制编码的方式。

我的想法是,我想要这样的东西: 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/ http://fiddle.jshell.net/ufcsccy3/

这是一个小提琴,但菜单不像在浏览器中那样工作,但是如果您看一下那里,您就会明白,它是左侧的菜单。

如何使用 Javascript 在导航中具有显示/隐藏功能? 我在这里思考的路径是否正确,正如我所看到的,类没有什么区别,但也许可以为我节省一些编码空间。

感谢您对此提供的任何帮助,我似乎无法找到可行的解决方案! 我希望它就像我第一次单击 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只是为了简单起见。添加您所做的点击事件是正确的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 单击打开和关闭菜单,不使用 jquery 的相关文章

  • IE8 中空 div 层的 z-index 问题

    我在 IE8 中遇到 z index 问题 其他尚未测试 以下 JS 创建一些 html css document write img src border 0 document write div style background col
  • 如何避免 TypeScript 中出现虚假的“未使用参数”警告

    我遇到过很多次这种情况 最后决定弄清楚正确的方法是什么 如果我有一个声明方法的抽象父类 然后一些具体子类在其实现中实现真正的逻辑 并且显然使用方法参数 但某些子类不需要在该方法中执行任何操作 因此不要使用方法参数 那些不必执行任何操作的方法
  • 创建 html 结构,每个 li 中仅允许 3 个 div 元素。在 React + underscore.js 中

    这是以下内容的位副本如何创建每个 li 中仅允许 3 个 div 元素的 html 结构 在 React underscore js 中 https stackoverflow com questions 38008023 how to c
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • @font-face 字体在 Mac 的 Safari 和 Chrome 中显示模糊

    I m using two special fonts on my website for headings and subtitles They are working fine on a PC in IE Firefox and Chr
  • 在电子生成器反应电子应用程序后,在 Windows 中出现空白屏幕

    在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 这是package json 在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 name SmallBusinessManagement version 0 1
  • 在 Chrome 中加载analytics.js时出现307重定向

    我正在构建一个网络应用程序并使用 Google Analytics analytics js 进行分析 我最近注意到 Chrome 中的分析功能无法正常工作 我使用单独模块中的标准代码片段加载分析并通过 requirejs 包含 我已验证该
  • 以 HTML 格式发送电子邮件

    我想发送 HTML 格式的电子邮件 如下图所示 我怎样才能做到这一点 请帮我 提前致谢 String body new String table tr td br header td tr br br Get b Best Score b
  • Onblur 事件在另一个 div 的 onclick 之前触发

    如上所述 我有一个按钮 单击该按钮将打开子菜单 对于子菜单中的每个选项 都有三个元素 我认为实际上还有更多元素 但为了简单起见 将其保留为 3 我将焦点放在子菜单的主 div 白色 框架 上 Onblur 这个 div 然后我隐藏子菜单 这
  • iPhone 点击时使 div 变暗

    当您的 div 附加了点击处理程序时 当点击该 div 时 iPhone 会使该 div 变暗 作为点击指示器 示例 在移动 Safari 上查看http jsbin com awejo3 4 http jsbin com awejo3 4
  • JavaScript 中的最短路径

    几周来我一直在寻找一种在 JavaScript 中计算最短路径的方法 我一直在玩书数据结构和算法作者 格罗纳 Groner 名字恰如其分 https github com loiane javascript datastructs algo
  • CSS:理解和调整字体的行距/行高

    有人问了一个非常相似的问题here https stackoverflow com questions 13701110 css remove line height leading on larger text但确实回答得足够了 CSS
  • CSS 动画自定义属性/变量

    一段时间以来我一直在努力让它发挥作用 关键是内部 div 将具有某种形状 并且可能会不止一个 这就是为什么我使用nth child选择器 这个内部 div 应该显示然后再次隐藏一段时间 问题是 我想在一个动画中为所有 后来的 多个内部 di
  • 媒体查询:如何定位桌面、平板电脑和移动设备?

    我一直在对媒体查询进行一些研究 但我仍然不太明白如何定位特定大小的设备 我希望能够针对台式机 平板电脑和移动设备 我知道会存在一些差异 但如果有一个可用于针对这些设备的通用系统 那就太好了 我发现的一些例子 Mobile only scre
  • 什么是 TinyMCE jQuery 包?

    我被要求在项目中使用 TinyMCE 编辑器 在下载页面上 有一个主包 然后是一个 jQuery 包 This package contains special jQuery build of TinyMCE and a jQuery in
  • 动态 dom 操作后,如何在浏览器历史记录中保留 dom 状态?

    是否有一个通用的解决方案来保留 dom 状态 以便当用户使用后退 前进返回页面时 整个页面处于他们离开时的确切状态 这篇文章询问并回答了为什么不同浏览器和不同 javascript 库的行为不一致 Ajax 后退按钮和 DOM 更新 htt
  • 这个 JQuery 指令做什么 $(function(){...}) [重复]

    这个问题在这里已经有答案了 我最近一直在研究JQuery 尽管我知道一些东西 但书上有这样一句话我根本无法理解 function current entry 1 有谁知道这条线是如何工作的以及它的作用是什么 它类似于 JQuery 函数中的
  • Javascript/jQuery 外部高度()

    Does idOfLememt outerHeight 对所有浏览器产生相同的结果 IE7 有什么不同吗 只要去http api jquery com outerHeight http api jquery com outerHeight
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo
  • JavaScript 中“键”的类型是什么?

    当我失去焦点并开始思考一个愚蠢的问题时 我遇到了这样的时刻 var a b value b 的类型是什么 我的意思不是 值 的类型 而是标记为 b 的实际键 背景 当我必须创建一个字符串键时 我开始想知道这一点 var a b value

随机推荐