【问题标题】:Show/Hide Div using JS使用 JS 显示/隐藏 Div
【发布时间】:2014-07-02 19:23:22
【问题描述】:

我正在开发一个个人网站,我正在尝试在单击图像时显示/隐藏,但我不确定问题出在哪里。

HTML

<div id="menuopen">
    <a href="#" onclick="toggle('menu');">
        <img src="assets/Images/menu.gif" alt="Menu">
    </a>
</div>

<div id="menu">
 <ul>
     <li><a href="index.html">Home</a></li>
     <li><a href="index.html">Home</a></li>
     <li><a href="index.html">Home</a></li>
     <li><a href="index.html">Home</a></li>
 </ul>
</div>

JS

<script type="text/javascript">
<!--
function toggle(id) { 
var item = document.getElementById(id);

if(item.style.display == 'block')
item.style.display = 'none';
else
item.style.display = 'block';  }
//-->

顺便说一句,这个脚本也不能使用纯文本而不是图像,所以我认为我的问题不在于那里。

【问题讨论】:

  • 你能提供一个fiddle吗?
  • 我链接了一个非常相似的问题。好奇你为什么不使用 jQuery - 它让这变得容易多了。虽然想要使用 vanilla JS 来学习是完全正确的:)
  • 另外,控制台上是否有任何错误?尝试将alert()s 放入函数中以确保代码到达那里。
  • 完美运行 -> jsfiddle.net/R5r3f/1

标签: javascript html


【解决方案1】:

有时样式属性在 JavaScript 中设置之前是空的/没有意义的。您可以先在 JS 中设置值,也可以让您的 JS 假定为起始状态。

解决方案 1 - 从 JS 设置状态:

var s = document.getElementById('menu').style;
s.display = 'block';
function toggle() { 
   if(s.display == 'block') { s.display = 'none'; }
   else { s.display = 'block'; }
}

解决方案 2 - 假设未设置意味着它是可见的

function toggle(id) { 
   var s = document.getElementById('menu').style;
   s.display = (s.display!=='block' ? 'block' : 'none');
}

【讨论】:

  • 你的方法没有任何意义!您是说我们应该在每次加载页面时迭代文档中的所有元素并将block 属性附加到它们的样式?!换句话说,您的函数不是解决方案。
  • 我不确定你在说什么。您说它“不是解决方案”,但结果相同。你说它“迭代所有元素......并附加块”给它们;我的代码没有这样做,它向一个特定元素添加了一个块。从性能的角度来看,这是一种哲学上的差异。由于 getElementById 的放置,您的解决方案(即我的第二个解决方案)在每次点击事件时会做更多的工作,而第一个解决方案会提前完成这项工作,因此您不必每次都按 Id 搜索。无论哪种方式,性能影响都是不可察觉的。
  • 我喜欢解决方案 1 的一点是,它对我来说更具可读性。您假设菜单从一个块开始,然后在一个块或无块之间切换。我的解决方案#1 明确地讲述了整个故事。我的解决方案 #2 和您的解决方案,不要明确地讲述这个故事,我觉得它的可读性和可维护性较差。如果您对起点有假设,请将这些假设编码。它不仅保证了这些起点,而且当您回头阅读它时,您可以看到该假设。
【解决方案2】:

检查这个。只是一个简短的解释,你的函数正在检查元素是否有一个 block 附加到它的显示属性的值,这是错误的 - 默认情况下,这个属性是空的。所以,宁可要求noneempty(默认)值。

function toggle(o) {
    var e = document.getElementById(o);
    e.style.display = (e.style.display != 'none' ? 'none' : '' );
}

【讨论】:

    【解决方案3】:

    我没有太多时间进行分析,但我建议使用带有点击触发器的体内函数,而不是预先定义函数。就像这里的小提琴一样:

    fiddle

    希望这会有所帮助,如果您需要澄清,请告诉我,我会尽我所能。

    【讨论】:

    • 所以您只是决定将其转换为 jQuery 并发布一个链接作为答案(对于甚至不接近问题的代码)?
    • 根据 Adeneo 的说法,这是有效的,所以我不确定为什么我不能让它正常工作
    • 为什么要重新发明轮子?此外,现在我有时间看一看,它似乎工作得很好。我的猜测是你在其他地方有干扰。 davidkonrad 指出您缺少 {},但这不应该影响功能(它只是简写)。我的猜测是还有其他影响功能的东西。你在哪里加载脚本?我确定它在您的脚本的头部,但值得检查。另外,页面上还有多少其他脚本(如果有)?
    • 您可能希望将 if 更改为 item.style.display !== 'none' 或将“Style="display: none" 添加到您的 div... 否则将需要两个第一次切换的点击次数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多