虽然我的问题本身似乎已经解决,但我希望有人能解释一下为什么会这样......
下面是同一函数的两个快照,它们的作用是删除包含用户反馈消息的 div。它设置为使用可选超时,如果指定超时,它会使用 setTimeout() 调用自身,然后删除 div。
该函数的两个版本之间的唯一区别是调用this.remove()的位置 - 在问题版本中,我首先使用blackbirdjs向日志发送消息,然后调用 this.remove() - 在此执行后日志被淹没与“删除反馈 div...”的无休止的日志消息一样快,浏览器可以将它们注入。
然而,在工作版本中,我只是颠倒了顺序,一切都正常执行,一切都很好......
我很困惑,我认为这种情况下的顺序是微不足道的,但显然不是。谁能解释为什么会发生这种情况?这是一个 jQuery 错误还是 blackbird 的问题或 JavaScript 的某种奇怪的怪癖?
注意:
我使用对 confirm() 的调用取得了一些喜忧参半的成功 - 如果它返回 false 我告诉它返回并且这停止了它 - 但是,只是在 remove 调用之后添加 return 没有效果。
有趣的是,这两个版本在 IE8 中似乎都可以正常工作——所以这可能是 firefox/gecko 问题?
问题代码:
function clear_feedback(target_container, timeout){
log.debug("timeout: " + timeout);
log.debug("target_container: " + target_container);
if(timeout == undefined){
log.info("removing target...");
$(target_container).children(".update_feedback").slideUp("slow",
function() {
log.info("Removing feedback div...");
this.remove();
}
);
}
else{
log.info("Setting timeout, THEN removing target...");
setTimeout("clear_feedback('" + target_container + "')", timeout);
}
}
工作代码:
function clear_feedback(target_container, timeout){
log.debug("timeout: " + timeout);
log.debug("target_container: " + target_container);
if(timeout == undefined){
log.info("removing target...");
$(target_container).children(".update_feedback").slideUp("slow",
function() {
this.remove();
log.info("Removing feedback div...");
}
);
}
else{
log.info("Setting timeout, THEN removing target...");
setTimeout("clear_feedback('" + target_container + "')", timeout);
}
}