【问题标题】:jQuery toggle show/hide default contentjQuery 切换显示/隐藏默认内容
【发布时间】:2020-05-13 19:15:59
【问题描述】:

如果单击菜单a,我有一个显示/隐藏切换开关。

点击功能触发前的内容显示在default div中。

由于某种原因,如果您两次单击a 标记之一,它会成功打开/关闭内容; 但是您会看到一个空白屏幕

这是一个糟糕的用户体验。

如何避免这种情况并确保在用户选择菜单项两次时显示默认内容?

$(document).ready(function() {
  var $show = $('.show');

  $('.menu a').on('click', function(e) {
    e.preventDefault();
    $show.not(this).stop().hide(450);
    $($(this).attr('href')).stop().toggle(450);
    $('.default').addClass('hidden');
  });


});
.hidden {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="menu">
  <a href="#show-screen">Screen</a>
  <a href="#show-music">Music</a>
  <a href="#show-art">Art</a>
  <a href="#show-food">Food</a>
</div>

<div id="show-screen" class="show">show screen</div>
<div id="show-music" class="show">show music</div>
<div id="show-art" class="show">show art</div>
<div id="show-food" class="show">show food</div>

<div class="default">default content</div>

谢谢

【问题讨论】:

  • 你的意思是如果显示并再次点击你不想隐藏?
  • @pc_coder 是的,所以如果我通过单击两次完成显示/隐藏操作 - 我希望默认的 div 可见。与空白屏幕相反
  • var atLeastOneElemtVisible = false, divs = $('.show'); divs.forEach(elem=>{ if(!elem.style.visiblity('hidden')){ // 更正语法 atLeastOneElemtVisible = true; break; } }); if(!atLeastOneElemtVisible){ $('.default').removeClass('hidden'); }
  • @RahulDwivedi 您可以将该代码添加为答案,而不是评论。
  • 当然 只是这样做了。基本上这是这个想法:检查是否所有的show div 都被隐藏了。如果是,请从您的 default div 中删除 hidden 类。如有任何语法错误,请见谅。

标签: javascript jquery toggle show-hide


【解决方案1】:

虽然我会建议一种完全不同的方法来处理这个问题,但为了让您的代码正常工作,我会做这样的事情。 https://jsfiddle.net/6cnt95ap/1/

$(document).ready(function() {
  var $show = $('.show');
  $('.menu a').on('click', function(e) {
    e.preventDefault();
    $show.not(this).stop().hide(450);
    $($(this).attr('href')).stop().toggle(450);
    $('.default').addClass('hidden');

  window.setTimeout(()=>{
        var showDefault = true, divs = $('.show');
     divs.each(function(){
       if($(this).css("display") !=='none'){
            showDefault = false;
            return false;
          }
    });
    if(showDefault){
          $('.default').removeClass('hidden');  
     }
  }, 500)

    });


  })

【讨论】:

  • 非常好——这就是工作。你介意简要解释一下它正在做什么 - 这样我就可以知道发生了什么。非常感谢!
  • 基本上我所做的是:遍历每个 div 以找到它们的“显示”属性,如果发现它们中的任何一个可见,则 showDefault 设置为 false,即我们赢了在这种情况下,不会显示默认文本。最后用 500 毫秒(>=450)将它包裹在 window.setTimeout 中,这是必要的,以确保发生早期的效果,之后才会发生这种情况。
  • 我刚刚意识到,如果我点击“屏幕”,它会显示默认内容。如果我再次单击屏幕,它会显示屏幕内容。该功能似乎以错误的顺序工作
  • @JordanMiguel 最初,每当出现块屏幕时,如果我解释正确,现在将显示“默认内容”,这就是您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多