【发布时间】:2020-10-16 10:59:19
【问题描述】:
我有一个包含一些元素的 div。当用户选择一个按钮时,div 被清除并动态填充新内容。我在清除 div 之前和填充它之后运行 slideToggle。隐藏 div 的第一个切换工作正常。第二个 slideToggle 没有运行(新的 div 只是在没有动画的情况下加载)。
我花了几个小时尝试不同的事情(回调函数、.on、promise、将第二个 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 高度(“height 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: 0
height 3: 3744
height 4: 324
【问题讨论】:
标签: javascript jquery dom slidetoggle