2012-05-13 16 views
1

我有一個點擊功能,當用戶註銷如何確保javascript/jquery在返回true之前總是完成點擊功能(打開鏈接)?

$('#logout').click(function(){ 

    // update database and tell other users that this person has logged off 

}); 

#logout是一個鏈接的ID(註銷按鈕)

將處理一些Ajax/PHP /數據庫操作的功能+發送一個socket的消息,並可能很容易需要幾個毫秒來完成

我可以相信,JavaScript/jQuery完成該功能之前實際返回true(打開鏈接被點擊)?

或者什麼是確保它完成它的一種方法..從「return false」開始,然後只返回true,如果它從php中接收到OK例如?

+1

如果你正在做的東西,AJAX,我建議你看一看[deferreds(http://api.jquery.com/category/deferred-object/) – elclanrs

+1

總是返回false,然後在成功回調你的Ajax調用進行下一個導航。 – nnnnnn

+1

AJAX操作的速度並不重要,因爲它是異步的,JS運行時會將它粘貼到隊列中,而不會在下次運行隊列時儘早得到它。鏈接的處理程序將始終首先返回。 –

回答

5

當一個操作涉及到AJAX或任何異步操作時,你永遠不能做「返回」。否則,你會失去異步的本質。

取而代之的是,一旦完成,就交出回調執行。或者返回一個延遲對象,讓它監聽Ajax是否完成。

$('#logout').click(function(e){ 
    //store location for later use 
    var location = $(this).attr('href'); 
    //prevent link from being followed for now 
    e.preventDefault(); 
    $.ajax({params}).done(function(e){ 
     //user logged out, follow link 
     window.location = location; 
    } 
} 

//while idle and waiting for ajax to complete 
//do a moonwalk... 
+0

這將適用於ajax部分。但我也觸發外部jquery函數/對象,似乎不會返回任何內容,並且「完成」不能使用..如果我將註銷鏈接放入按鈕(沒有默認操作)會有幫助嗎? ,然後在函數中手動重定向? – mowgli

+0

@mowgli這就是編輯所做的事情,「window.location」部分在完成時做了重定向。 – Joseph

+0

好的;)我可以這樣做嗎? 。\t \t $( '#signout')點擊(函數(){ \t \t VAR URL = 「/登錄/退出/」; \t \t \t如果(channel.send){ \t \t $(位置).attr ('href',url); \t \t} \t});我不知道channel.send做了些什麼(除了通過websocket發送消息),因爲它來自外部縮小/壓縮的js文件,但它似乎返回true。但是我不知道它是否只在完成後才返回true。對不起 – mowgli

相關問題