2011-08-30 42 views
2

當用戶點擊單選按鈕時,我的程序會執行ajax調用。成功後,包含單選按鈕的表格單元格的背景顏色將更改,以讓用戶知道他們的選擇已發佈到數據庫。當用戶超出ajax時該怎麼辦

問題是有時背景不會改變。我陷入錯誤,所以我不認爲這是由於錯誤。我想知道用戶是否超過成功回調。

var setup = {}; 
setup.url = 'Gateway.cfc'; 
setup.type= 'POST' 
setup.dataType='json'; 
$.ajaxSetup(setup); 

var settings = {}; 
settings.data = {}; 
settings.data.method = 'Save'; 
settings.data.AssignmentID = $('input[name=AssignmentID]').val(); 
settings.error = function(xhr, ajaxOptions, thrownError) { 
    $('#msgErr').text(thrownError); 
}; 

settings.success = function(result) { 
    $('#msg').empty(); 
    $('#msgErr').empty(); 
    if (result.RTN) { // uppercase RTN 
     $('#' + settings.data.AnswerID).addClass('answer'); 
    } else { 
     $('#' + settings.data.AnswerID).next().append('<span class="err"> ' + result.MSG + '</span>'); 
    } 
} 

$('input').filter(':radio').change(function() { 
    var myName = $(this).attr('name'); 
    $('input[name=' + myName + ']').closest('td').removeClass('answer'); 
    settings.data.AnswerID = $(this).val(); 
    $.ajax(settings); 
}); 
+0

我認爲這可能是你重複使用'settings'對象作爲全局結構的問題。你在'.change'函數中重置了ID,但是傳遞了相同的設置對象,所以你可能會在那裏發生衝突。你有沒有嘗試複製設置對象,並將對象的副本傳遞給你的'ajax()'調用,而不是重用全局變量? –

+0

我認爲你的意思是:var obj = {}; $ .extend(obj,settings); $阿賈克斯(OBJ); –

+0

或更好:var obj = $ .extend(true,{},settings); $。ajax(obj); –

回答

1

要去張貼此作爲一個答案,在關閉的機會,它的伎倆:)

$('input').filter(':radio').change(function() { 
    $(this).closest('td').removeClass('answer'); 
    var mySettings = $.extend(true, {data:{AnswerID: $(this).val()}}, settings); 
    $.ajax(mySettings); 
}); 

這將確保有沒有競爭條件與你的設置,如果調用快速連續製造。

+0

我認爲這固定了丹。謝謝!我不知道我理解數據:{AnswerID:$(this).val()}部分,所以我只是擴展設置,它似乎工作。 –

+0

當你擴展一個對象(在本例中爲'settings')時,在擴展它時,可以添加其他參數。因此,在您的原始代碼中,您正在設置'settings.data.AnswerID'。我簡單地擴展了設置,同時添加了AnswerID。做一兩行,你會得到同樣的結果。很高興解決你的問題:) –

3

您的Ajax帖子到服務器和您的屏幕上的ui元素更新之間存在延遲。我不知道您正在使用哪個Ajax庫,但可以插入Ajax框架並顯示覆蓋整個屏幕的浮動div元素。這個div可以具有其他元素,如圖像或其他div,跨度,p標籤等。這在一些庫中也稱爲對話框。

我建議嘗試在Ajax庫中找到before_Ajax_send和after_Ajax_receive函數,並將函數附加到這些事件中。 before_send函數應該顯示浮動div,after_receive應該關閉div。

希望這會有所幫助。

+0

啊,我明白你在做什麼了。你正在阻止用戶點擊另一個單選按鈕,直到ajax完成。 –

+1

我可以打開async = false,但我不認爲我想癱瘓用戶。 –

+0

是的,關鍵是讓用戶知道你的應用程序正在做什麼,所以請握住你的馬。我不知道'aync = false'是什麼,但你可能不想這樣做,如果它符合我的想法。您實際上需要異步功能,但只是希望用戶知道應用程序正在執行某些操作,因此請勿在屏幕上更改任何內容,因爲它可能會被覆蓋。另外,如果您不使用模式對話框,您的應用程序的行爲可能會非常混亂。 – Nabheet