为了账号安全,请及时绑定邮箱和手机立即绑定

slideToggle 然后动态创建内容和 slideToggle 返回的正确方法

slideToggle 然后动态创建内容和 slideToggle 返回的正确方法

波斯汪 2023-05-19 16:13:16
我有一个包含一些元素的 div。当用户选择一个按钮时,div 将被清除并动态填充新内容。我在清除 div 之前和填充它之后运行 slideToggle。隐藏 div 的第一个切换工作正常。第二个 slideToggle 没有运行(新的 div 只是加载而没有动画)。我花了几个小时尝试不同的事情(回调函数、.on、承诺、将第二个 slideToggle 函数放在代码的不同部分,等等)。我终于通过使用 1 毫秒的 setTimeout 来让它工作。尽管它有效,但我比以往任何时候都更加困惑,并且质疑我生活中的一切。请帮助我了解发生了什么。工作代码:changeCat:function(catName){    domObject.$positionsDiv.slideToggle(function(){        domObject.$positionsDiv.html('');        let yourCategories = getSubFolders(catName+"/");        if(catName==='s'){            tSCat.drawCats(yourCategories);        } else if(catName==='g'){            tGCat.drawCats(yourCategories);        }        setTimeout(function (){            domObject.$positionsDiv.slideToggle(function(){                resizeCanvas()            });        }, 1)    });},真正让我困惑的是,如果我控制台记录目标 div 的高度。我希望最后调用的控制台日志(“高度 5”)首先被调用。div 高度(“高度 3”)是在我调用第二个切换之前完全填充的 div 的高度(那么为什么它不起作用?)。非工作代码(无超时,带有控制台日志)changeCat:function(catName){    domObject.$positionsDiv.slideToggle(function(){        console.log('height 1: ' + domObject.$positionsDiv.height())        domObject.$positionsDiv.html('');        console.log('height 2: ' + domObject.$positionsDiv.height())        let yourCategories = getSubFolders(catName+"/");        if(catName==='s'){            tSCat.drawCats(yourCategories);        } else if(catName==='g'){            tGCat.drawCats(yourCategories);        }        console.log('height 3: ' + domObject.$positionsDiv.height())            domObject.$positionsDiv.slideToggle(function(){                console.log('height 4: ' + domObject.$positionsDiv.height())                resizeCanvas()            });    });    console.log('height 5: ' + domObject.$positionsDiv.height())},控制台日志按此顺序返回,具有以下值:height 5: 359.333 height 1: 2214 height 2: 0height 3: 3744height 4: 324
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

“传统”方式是将“显示”代码放在“隐藏”回调中:


$("#d").slideToggle(function() {

  $(this).html("a<br/>b<br/>c<br/>");

  $(this).slideToggle()

})

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id='d'>

  1<br/>2<br/>3<br/>

</div>

在 1 毫秒超时后调用“show”与立即调用“show”时发生的情况相同。

.slideToggle()使用.animate()并且.animate()同一 DOM 节点上的每个调用都会排队。那么会发生什么:

  • 你的“隐藏”开始

  • “表演”正在排队

  • 隐藏完成并调用回调在“不可见”时设置内容

  • 演出自动出队

$("#d").slideToggle(function() {

  $(this).html("a<br/>b<br/>c<br/>");

});

$(this).slideToggle()

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id='d'>

  1<br/>2<br/>3<br/>

</div>


查看完整回答
反对 回复 2023-05-19
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信