2013-02-22 121 views
3

我有以下的javascript代碼:

$.post("<receiver>", postdata); 

,並得到POSTDATA並非總是如此。如果我寫下面的代碼一切正常:

$.post("<receiver>", postdata); 
alert('bla-bla-bla, read me for a second'); 

爲什麼?隨着javascript的運行,頁面在保存按鈕上發生變化。但是我需要在重定向之前發送發佈數據。

+0

看一看這個問題進行了廣泛的解釋:http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-呼叫從-A-功能。 – 2013-02-22 09:52:34

回答

1

您應該在AJAX調用的成功回調內部重定向:

$.post("<receiver>", postdata, function() { 
    window.location.href = '...'; 
}); 

爲什麼如果你$.post電話後,立即把警報您的代碼工作的原因,是因爲在此提醒彈出,瀏覽器掛起執行和你的AJAX調用有足夠的時間來完成。

不要忘記,在AJAX的第一個A代表異步的含義,你可以只消耗的結果從服務器返回成功回調。

此外,如果這個AJAX調用內部形式的一些.submit()事件處理程序或內部提交按鈕或錨的一些.onclick()處理程序進行,你應該確保你已經通過返回false,否則你的AJAX調用取消默認的動作將在瀏覽器重定向離開頁面之前,沒有時間去執行。

例子:

$('#myForm').submit({ 
    $.post("<receiver>", postdata, function() { 
     ... 
    }); 
    return false; // <!-- That's the important bit 
}); 
0

你的警覺導致您的腳本暫停,因此讓時間爲你$.post()完成。

你應該把你的重定向腳本放在你的$.post()回調中。

0

因爲它會導致延遲。當您按下確定時,請求(至少需要幾毫秒)纔會完成,並且可以依照它進行操作。

爲了防止發生這種情況,您可以傳遞一個回調函數,該函數在請求獲得響應後運行。

$.post(url, postdata, function() { 
    // Success. 
}) 
0

.post是異步的。

如果您在發佈過程()期間更改頁面,POST請求將被中止。 您的alert正在阻止此頁面更改

您應該用.ajax同步請求替換.post,驗證成功提交表單提交(return true;)。或者按照@DarinDimitrov或@Curt建議的那樣做

1

啊,所以你的問題的缺失部分似乎是你正在發送數據點擊某件事是嗎?推測是一個鏈接?該鏈接會使瀏覽器立即關注它,並且在您的示例中,警報足以延遲瀏覽器,使您的帖子有足夠的時間完成。

您需要確保該鏈接的默認操作被阻止,並在$的回調中執行重定向。後()代替:

$("a.some_class").click(function(evt) 
{ 
    evt.preventDefault(); // makes sure browser doesn't follow the link 

    // gather your post data here ... 

    var $this = this; 
    $.post("<receiver>", postdata, function() 
    { 
     window.location.href = $this.attr("href"); 
    }); 
}) 
+0

但我需要使用標準事件處理程序將所有參數傳遞到新頁面。是否可以使用preventDefault,然後再次發佈後調用默認處理程序? – Dmitry 2013-02-22 09:55:37

+0

我需要更多信息:你確實點擊了一個鏈接?什麼是你所指的「所有參數」?你的意思是查詢字符串參數?如果是,我上面粘貼的代碼使用標籤的原始href屬性。因此,如果該屬性包含查詢字符串參數,它們將會發送得很好。實際上,它只是延遲點擊鏈接的默認執行。 – 2013-02-22 10:00:34

相關問題