slideToggle 后如何测试 DIV 是打开还是关闭

Posted

技术标签:

【中文标题】slideToggle 后如何测试 DIV 是打开还是关闭【英文标题】:How to test if DIV is open or closed after slideToggle 【发布时间】:2011-03-10 20:41:40 【问题描述】:

我有一个 Jquery Ui 按钮 (#toggleIcons),当单击该按钮时,它会切换 div (.icons) 以显示一些图标。我还使用 Jquery Isotope 和 Infinitescroll 来动态添加新图像。我想要做的是有一种方法可以在添加和更新新图像时保留 slideToggle 状态。 ifinitescroll 有一个回调函数,以便我可以更新页面和图标的状态。

//My button click function
$("#styleSwitcher #toggleIcons" ).click(function() 
   $('.icons').slideToggle('slow');
   //for Isotope to update the layout
   $('#container').isotope('reLayout') 
    return false;
);

//code I am working on to put in callback to test if div is open or closed
if($(".icons").is(":hidden"))

  $('.icons').hide();

else

  $('.icons').show();

不工作。任何帮助或方向将不胜感激。谢谢

【问题讨论】:

定义不起作用。在我看来,hide().icons 当它们已经是 :hidden 时没有任何意义。切换if 子句中的语句或测试另一个元素。 按钮点击和添加图片有什么关系吗?还是它们是单独的动作? 【参考方案1】:

你的条件倒退了:

if ($(".icons").is(":visible"))  <-----
  $('.icons').hide(); 
 else 
  $('.icons').show(); 

【讨论】:

【参考方案2】:

将检查状态脚本放在一个函数中 - 让它保持一点..

$('.advance-view').click(function() 
    $('#advance-control').slideToggle('slow', function() 
        if ($('#advance-control').is(':hidden'))
        
            $('.advance-view').css("background-color", "#2B509A");
        
        else
        
            $('.advance-view').css("background-color", "#4D6837");
        
    );             
);

【讨论】:

【参考方案3】:

我会使用:visible

if($(".icons:visible").length > 0)
    //item is visible
else
    //item is not visible

但如果你想坚持你的代码

if($(".icons").is(":hidden"))

应该读

if($(".icons").is(":hidden").length > 0)

【讨论】:

【参考方案4】:

为什么不只是toggle 或slideToggle 呢?

$(".icons").toggle();

【讨论】:

【参考方案5】:

我也在做同样的事情,但是对于基于 id 的设置,然后我发现当我使用它时它可以工作

if ($(this).is(':hidden')) 
    var state = "closed";
 else 
    var state = "open";


alert($(this).attr('id') + ' is ' + state);
return false;           

【讨论】:

【参考方案6】:

我想我明白你想要什么。通过某个与添加图像无关的按钮,用户可以隐藏和显示图标。添加了新图像,图标“显示”,您不知道回调是应该显示图标,还是隐藏它们以匹配图库的其余部分。

//My button click function
$("#styleSwitcher #toggleIcons" ).click(function() 
$('.icons').slideToggle('slow');
//for Isotope to update the layout
$('#container').isotope('reLayout').data(iconStateIsHidden:$('.icons').is(":hidden")); 
 return false;
 );



 //code I am working on to put in callback to test if div is open or closed



       if($("#container").data()[iconStateIsHidden])
          
// newly added images should match the rest of the gallery
        $('.icons').hide(); 
               
        else
          
// newly added images should match the rest of the gallery
        $('.icons').show(); 
           

【讨论】:

完全正确。如果图标正在显示,它们应该保持显示等。该按钮不添加图像,只是切换 .icon div。还没有让代码工作,但是一个好的方向。感谢您的帮助!!! 我刚刚开始真正使用 .data(),我不会怀疑我可能会错误地使用它。此外, $('icons').is(":hidden") 将检查匹配集中的所有图标。 .is() 将 ||检查它们,所以如果一个被隐藏,那么它返回 true【参考方案7】:

您使用了另一种更健壮、更短的方法。 您可以向元素添加属性,例如“打开”。 第一次阅读时它不存在,因此它假定它是初始位置。 如果它是'0'那么你把它反转并在条件块中你做slidedown()或slideup()

这有很多好处: - 您可以通过浏览器调试器读取值并查看它的变化 - 最有用的是您可以使用 .each 迭代器读取该值并检查打开的值

function toggleBox(id) 
    let o = $("#box_" + id);    
    let op = o.attr("open") !== undefined;  
    if (op) 
        o.slideUp();
        o.removeAttr("open");       
     else 
        o.slideDown();
        o.attr("open","1");     
       

【讨论】:

【参考方案8】:

slideToggle 不会立即更改可见性。你需要解决这个问题

var hidden=$('#targetdiv').is(':visible'); //check the visibility before calling slideToggle
var $('#yourbuttonid').slideToggle(); //toggle it
if(hidden)
 #put whatever you want to do here when #targetdiv is OPEN!

else
 #content for when #targetdiv is CLOSED

希望这个迟到 10 年的答案对你有用

我是从 https://forum.jquery.com/topic/state-of-slidetoggle 的 7 年前的帖子中发现的

【讨论】:

以上是关于slideToggle 后如何测试 DIV 是打开还是关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何防止slideToggle在第一次点击时打开然后关闭

使用 .slideToggle 从底部拉出隐藏的 div

jquery幻灯片-slideToggle

jQuery SlideToggle 谷歌地图问题

如何使用slideToggle()更改按钮值

jQuery slideToggle 函数将 div 向下滑动然后立即备份