Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery回调函数未等待完成_Javascript_Jquery_Html_Css - Fatal编程技术网

Javascript jQuery回调函数未等待完成

Javascript jQuery回调函数未等待完成,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我的多分区菜单系统有问题。我在同一页上有3个div用于3个单独的显示。默认情况下,将显示“about”div。单击“联系人”或“继续”时,“关于”分区应先向上滑动,然后再向下滑动其他分区。单击其他菜单选项将获得相同的结果 以下是页面的基本布局: <div id="menutabs"> <ul> <li><a href="#" name="divAbout"><span>About</span><

我的多分区菜单系统有问题。我在同一页上有3个div用于3个单独的显示。默认情况下,将显示“about”div。单击“联系人”或“继续”时,“关于”分区应先向上滑动,然后再向下滑动其他分区。单击其他菜单选项将获得相同的结果

以下是页面的基本布局:

<div id="menutabs">
    <ul>
        <li><a href="#" name="divAbout"><span>About</span></a></li>
        <li><a href="#" name="divContact"><span>Contact</span></a></li>
        <li><a href="#" name="divResume"><span>Résumé</span></a></li>
    </ul>
</div>
问题是,我编写的代码页面上只有2个div,它工作得非常完美。回调函数直到第一个div向上滑动完成后才执行。然而,当我添加第三个div时,它不再等待

我已经注释掉了多个div,以确认该问题只是在页面上有3个div,因为无论我没有注释哪2个div,它都不会这样做


有什么想法吗?

问题是每个元素调用一次回调

因此,如果有10个
.contentbox
元素获得
slideUp
,那么您将在“'.'+divname”上触发
slideDown
方法10次。这可能会导致意外问题

为了避免这种情况,可以使用简单变量作为标志

$(“a”)。单击(函数(){
var divname=this.name;
var已运行=false;
$(“#”+divname).同级(“.contentbox”).slideUp(“slow”,function()){
如果(!已运行){
$(“#”+divname).slideDown(“slow”);
has_run=true;
}
});
返回false;
}); 
另一个解决方案是使用
setTimeout
代替
slideUp
的回调

$(“a”)。单击(函数(){
var divname=this.name;
$(“#”+divname).sides(“.contentbox”).slideUp(“slow”);
setTimeout(函数(){
$(“#”+divname).slideDown(“slow”);
}, 600);
返回false;
}); 
您可以使用jquery

 .delay()
使用以毫秒为单位的值可获得更好的计时效果

$("#"+divname).siblings(".contentbox").slideUp(200).delay(300).end().slideDown(200);

例如

我可能应该注意到,div都共享一个“contentbox”类,这就是jQuery查找该类同级的原因。谢谢!我想这是因为函数通过并检查所有的兄弟姐妹。。。它为打开的同级执行代码,但当它涉及到关闭的同级时,它解释为函数完成。您的第一个示例不起作用,但是setTimeout函数比我使用的延迟(600)解决方案工作得更顺利。仍然不完美,但要好得多。@one800higgins:不客气。我很惊讶第一个例子不起作用。如果(!has_run)中的代码只能运行一次。奇怪,是的,这是我的第一个想法。。。但它看起来不那么干净。用户“am not i am”对setTimeout()有一个更好的延迟想法,它在这种情况下工作得更平稳。好的,我建议将jquery对象存储在一个变量中,以保存1个dom search///var$div=$(“#”+divname);
$("#"+divname).siblings(".contentbox").slideUp(200).delay(300).end().slideDown(200);