2014-05-21 48 views
2

我有一個奇怪的問題。阿賈克斯加載圖像

function sendEmail(settings) { 
    var success = false; 

    $.ajax({ 
     type: "POST", 
     contentType: settings.contentType, 
     data: settings.data, 
     url: settings.url, 
     dataType: "json", 
     async: false, 
     beforeSend: function() { 
      setTimeout(showOrHideLoadingImage("LoadingImage", "show"), 2000); 
      //$("#LoadingImage").show(); 
     }, 
     success: function (data) { 
      setTimeout(showOrHideLoadingImage("LoadingImage", "hide"), 500); 
      //$("#LoadingImage").hide();//Hide loading image 

showOrHideLoadingImage功能:

function showOrHideLoadingImage(id, action) 
{ 
    if (action == "show") { 
     $("#" + id).show(); 
    } else { 
     $("#" + id).hide(); 
    } 
} 

我使用此代碼來發送郵件,的郵件到達但ajaxLoading圖像不顯示

如果我把一個 「debuger」 「beforeSend」事件顯示圖像,所以我嘗試使用java腳本setTimeout函數 ,但沒有運氣。

*我有關於這個的另一個問題,ajaxSuccess和錯誤全局事件。

我紅認爲,它能夠更好地使用這些事件:

如果我將使用$(「#LoadingImage」)每次,郵件加載圖像將顯示

但如果我有其他的ID與加載圖片?

+0

'的setTimeout(函數(){showOrHideLoadingImage( 「LoadingImage」, 「秀」);},2000);' – tymeJV

+0

@ mituw16當然,我已經編輯我的問題。 沒有發佈它,因爲它是一樣的,她或弱智 –

+1

我想你可能會在這個類似的帖子中找到解決方案:http://stackoverflow.com/questions/16046387/jquery-ajax-beforesend可能的Dupe? – Dave

回答

0

showOrHideLoadingImage被立即調用,使用在setTimeout一個匿名函數,然後使用參數調用你的方法:

setTimeout(function() { 
    showOrHideLoadingImage("LoadingImage", "show"); 
}, 2000); 
+0

這不是問題。 –

0

幾件事情要指出。開發人員通常會將代碼放入beforeSend方法中,該方法將立即執行。

因此下列情況屬實;

$.ajax({.... 
    beforeSend: function() { 
    $(....).show(); 
    } 

與之相同。其次,不要將您的加載圖像隱藏在success承諾的處理程序中。你想要always刪除加載器。

因此;

$(....).show(); 
$.ajax({...}).always(function(){$(...).hide();}); 

現在,超時將始終執行。即使AJAX快速執行。所以如果你只想在2秒延遲後顯示加載器。您需要保留計時器ID。

var timeID = setTimeout(function() { $(...).show();}, 2000); 
$.ajax({...}).always(function(){ 
    clearTimeout(timeID); 
    $(...).hide(); 
}); 

always回調您使用timeID刪除定時器。這可以防止它在尚未發射的情況下發射。

如果我將使用$(「#LoadingImage」)每次,郵件加載圖像將顯示

嘗試使用jQuery closest API找到DOM元素相對於是什麼觸發了事件。

http://api.jquery.com/closest/

+0

其實我希望「加載圖片」能夠持續更長的時間.. 我刪除了它, 第二個問題。 ajax成功和錯誤全局事件。 我紅認爲,它能夠更好地使用這些事件: 如果我將使用$(「#LoadingImage」)每次,郵件加載圖像將顯示 但如果我有其他的ID與裝載的形象? –

+0

我實現了你在這裏說的所有東西,現在工作正常 –

0
$(document).ready(function(){ 
$(document).on('click', '#id', function(){ 
    sendMail(); 
}); 
}) 

function sendMail(){ 
$('#image').show(); 
$.ajax({ 
    url: url, 
    type: 'POST', 
    success: function(){ 
     //DO SOMETHING HERE 
    }, 
    error: function(){ 
     //DO SOMETHING HERE 
    }, 
    complete: function(){ 
    $('#image').hide() 
    } 
}); 
} 
+0

complete:function()and $ .ajax({})。complete(function(...){}) 是一樣的東西,對吧? –

+0

如果我正確地閱讀文檔,它幾乎是一樣的(減少一些細微的差異),但我不會推薦使用'.complete(function(...){})',因爲它在版本1.8 JQuery庫,並可能會在更高版本中完全刪除。 – Damian

+0

好吧,$ .ajax({})。complete(function(...){})是首選。第二個問題是 。 ajax成功和錯誤全局事件。我紅色,它更好地使用這些事件:如果我將每次使用$(「#LoadingImage」),郵件加載圖像將顯示,但如果我有其他ID加載圖像? –