2013-03-11 143 views
1

我有一段代码,工作的方式,它应该。jquery ajax幻灯片功能

function showContent(pos,direction){ 
$("#area").hide("slide", { direction: direction=="left"?"right":"left"}, 2000); 
$("#area").load("flow_forms.jsp #area" + pos); 
$("#area").show("slide", { direction: direction }, 500); 
} 

$('#next').click(function(){ 
    if(question_pos==0){ 
     question_pos+=1; 
     showContent(question_pos,"right"); 
     return true; 

该区域应该向左滑动,加载离屏,然后从右侧滑入加载的区域内容。

基本上我遇到的问题是.load出现在.hide之前。所以我所拥有的是一个区域,它会在向左滑动时加载,然后从右侧引入已加载的区域。我的老板建议了一个回调函数,但我甚至不知道那是什么...

+0

我不知道是否有办法阻止.load直到后。隐藏完成了吗? – user2089255 2013-03-11 17:35:01

回答

0

你应该利用回调函数 - 这些曾经当前函数执行完毕,像这样的运行:

function showContent(pos,direction){ 
    $("#area").hide("slide", { direction: direction=="left"?"right":"left"}, 2000,  
     function(){ 
      $("#area").load("flow_forms.jsp #area" + pos, function(){ 
       $("#area").show("slide", { direction: direction }, 500); 
      }); // Load callback 
     } // Hide callback    
    ); 
} 
+0

这是部分工作,但生病继续下去。 – user2089255 2013-03-11 17:44:44

+0

什么不起作用? – 2013-03-11 17:45:37

+0

它不做第二部分,第二个功能是未定义的。我不知道如何使用回调,所以也许我做错了什么。 – user2089255 2013-03-11 17:47:19

1

您可以让.load等到第一个动画完成时,通过使用完成回调或通过“承诺“在元素的动画队列:

$("#area").hide(...).promise().done(function() { 
    $("#area").load(..., function() { 
     $(this).show(...); 
    }); 
}); 

有实际上是一个更好的选择,虽然,这将允许您开始.load而动画是持续的 - 这将是更加敏感:

var $tmp = $('div'); 

var loaded = $.Deferred(function() { 
    $tmp.load(...); // load into an off-screen div 
    this.resolve(); 
}); 

var hidden = $('#area').hide(...).promise(); 

$.when(loaded, hidden).done(function() { 
    // move #tmp contents to #area and show it 
    $('#area').empty().append($tmp).show(); 
}); 

$.when()要求AJAX加载和动画都已完成,同时允许它们同时进行。

+0

我试试这个,谢谢。 – user2089255 2013-03-11 17:37:50

+0

@ user2089255我已经更新了这个 - 第一个回答是基于'.show()'而不是'.hide()' - 我很困惑你使用相同的元素为滑出和以下滑动项。 – Alnitak 2013-03-11 17:42:33