【问题标题】:Checking if a div is visible or hidden and toggleing a class检查 div 是否可见或隐藏并切换类
【发布时间】:2018-10-07 09:15:57
【问题描述】:

我连续有多个复选框。单击按钮时,它会显示一个 div (#locale_container),并且会翻转一个小箭头(通过添加旋转的类)。

但是我不希望每次选中复选框时箭头都会翻转,只有当 div 可见或隐藏时。

即 如果复选框 1 被选中然后旋转(div 被隐藏然后可见),那么如果未选中则再次旋转(div 可见然后隐藏)。

如果选中复选框 2 和复选框 3,则旋转,但如果未选中复选框 3 且复选框 2 仍选中,则不旋转。

这是我迄今为止设法构建的,但似乎无法让它工作!

如何让它在每次选中该框时停止旋转 - 检查 div 何时可见或隐藏!

$(document).on('change', '#est', function (e)
{
    e.preventDefault();
    $( "#locale_container" ).slideDown( "Medium");

    if (!$('#locale_container').is(':visible'))
    {
        console.log("hidden");
        $("#locale_arrow").toggleClass('flip');
    }
    else
    {
        console.log("visible"); 
    }

    console.log("Check")
});

编辑:JSFIDDLE https://jsfiddle.net/10yf47an/2/

我的 HTML

  <div class="inner" id="est">
  <label>
  <input type="checkbox"><span>Club</span></label>
  </div>
  <div class="inner" id="est">
  <label>
  <input type="checkbox"><span>Pub</span></label>
  </div>



<img id="locale_arrow" src="https://image.flaticon.com/icons/svg/7/7645.svg" >
      <div id="locale_container">
   DEMO</div>

我的 CSS

#locale_container {display:none}

.flip {transform: rotate(-180deg);}

#locale_arrow {height: 40px}

【问题讨论】:

  • 如何隐藏/显示 div?如果你使用不透明度,你可以检查它的值是0还是1,如果你设置“显示:无”你可以检查它是否被设置,等等。
  • 我正在使用 display:none
  • 乍一看你的代码应该可以工作,你能提供一个工作的codepen/fiddle吗?
  • 我会做一个小提琴!给我几分钟 - 谢谢!
  • 您似乎有一些语法错误,1: 一个 id 必须 是唯一的页面是有效的 (X)HTML, 2: 你有一个结束 &lt;/div&gt; 没有一个开始 &lt;div&gt; 标记,3: 你有一个不必要的分号在你的 @987654330 的结束 } 后面@。另外:请在您的问题中发布您的“minimal reproducible example”代码,JS Fiddle 演示是一个奖励,但它不能替代问题本身中存在的代码。

标签: javascript jquery html


【解决方案1】:

好的,我提供了一个 sn-p 示例,其中包含我无法理解的内容,请告诉我它是否按预期工作。

$(document).on('change', '.inner', function (e)
{
    // Get number of checkboxes checked.

    var counter = $('input[type="checkbox"]:checked').length;
    console.log("Checkboxs checked number: " + counter);
    
    e.preventDefault();
    
    if (counter > 0 && !$('#locale_container').is(':visible'))
    {
        $("#locale_container").slideDown("Medium");
        $("#locale_arrow").addClass("flip");
    }
    else if (counter <= 0)
    {
        $("#locale_container").slideUp("Medium");
        $("#locale_arrow").removeClass("flip");
    }
});
#locale_container {display:none}

.flip {
  transform: rotate(-180deg);
}

#locale_arrow {height: 40px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="inner">
    <label>
        <input type="checkbox"><span>Club</span>
    </label>
</div>
<div class="inner">
    <label>
        <input type="checkbox"><span>Pub</span>
    </label>
</div>
  
<img id="locale_arrow" src="https://image.flaticon.com/icons/svg/7/7645.svg" >

<div id="locale_container">DEMO</div>

【讨论】:

  • 太棒了!工作正常!谢谢!
【解决方案2】:

这是一个有效的版本:

JSFiddle

HTML:

 <div class="inner" id="est">
 <label>
   <input class="est" type="checkbox"><span>Club</span></label>
   </div>
   <div class="inner">
   <label>
   <input  class="est" type="checkbox"><span>Pub</span></label>
   </div>

 <img id="locale_arrow" src="https://image.flaticon.com/icons/svg/7/7645.svg" ></div>
       <div id="locale_container">DEMO</div>

JS:

$(document).ready(function() {
    $('.est').on('click', function (e) {

        if (!$('#locale_container').is(':visible')) {
        $("#locale_arrow").toggleClass('flip');
      $( "#locale_container" ).slideDown( "Medium");
        console.log("hidden");
        } else {
        console.log("visible"); 
    }
     console.log("Check")
    });
});

问题在于“slidedown”方法切换了元素的可见性,因此您无法正确检查。

【讨论】:

  • 好的 - 明白了!谢谢
  • 我有一个演示 (jsfiddle.net/davidThomas/g13xod4u) 不同意您关于“[change] 事件在 [checkboxes] 上不起作用”的说法。
  • 你是对的!我只是误读了 jquery api 参考!它适用于它,只是立即触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多