我有一个包含一些元素的 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>
添加回答
举报
0/150
提交
取消