2013-03-28 75 views
2

在ajax调用之后,我在某些情况下关闭了我的花哨框。Fancybox在ajax调用后没有关闭

$(document).ajaxStop(function() { 
    function(){$.fancybox.close()}; 
}); 

$(document).ajaxStart(function() { 
    $("a#load_gif").trigger('click'); 
}); 

这是我的代码处理花式框。所以我的问题是,如果ajax调用非常短暂且快速,那么该框不会关闭,但如果调用时间较长,它会自动关闭,因为它应该是。

我已经找到了解决沿着这

$(document).ajaxStop(function() { 
    setTimeout(function(){$.fancybox.close()},500); 
}); 

行但说实话这种解决方案是不是好找去。即使ajax调用返回的速度非常快,我该怎么做才能使花式框关闭? ajax调用的长度根据要获取的行数而变化。

任何帮助和/或建议表示赞赏。

回答

2

看起来好像你有一个竞争条件,也许fancybox没有完成创建,并没有定义关闭函数,当你的AJAX调用试图关闭该关闭函数。

我推荐一个2步骤的过程来触发fancybox关闭。创建2个全局变量ajaxStop = false;fancyboxDone = false;

创建这样一个功能:

function closeFancyBox(){ 
    if(ajaxStop && fancyboxDone){ 
     $.fancybox.close(); 
     ajaxStop = fancyboxDone = false; 
    } 
} 

然后改变你的Ajax停止:

$(document).ajaxStop(function() { 
    function(){ 
     ajaxStop = true; 
     closeFancyBox() 
    }; 
}); 

最后添加的onComplete功能,你的fancybox,做同样的作为阿贾克斯停止,但设置fancyboxDone = true而不是ajaxStop

所以,现在无论哪一个完成第一个和第二个,他们将能够检查彼此的状态并适当地启动关闭。

+0

你的功能就像魔术一样!它工作得很好。一个伟大而干净的修复。谢谢。 – Rayfloyd

+0

“你的功能就像魔术一样!” - 哈哈,到目前为止我已经得到了最好的回应。 – invertedSpear

+0

那么,在发布这个问题之前,我一直在寻找很长很长的一段时间,所以我很高兴看到一个像这个哈哈一样干净清晰的答案。 – Rayfloyd