2016-07-18 35 views
-1

我必須進行ajax調用,並根據響應來決定是否離開頁面。這是我到目前爲止所嘗試的。onbeforeunload在ajax調用中不返回字符串

window.onbeforeunload = function(e) { 
    $.when($.ajax({ 
     url: checkUrl, 
     async: false, 
     type: 'GET', 
    })).then(function(data, textStatus, jqXHR){ 
     if(data===false) 
      return "Appointment not created yet. Do you wish to leave?"; 
     else 
      return false; 
    });} 

當我使用調試器來檢查控制,似乎要等到返回的數據流,但它不會顯示警告框。

我不知道我在做什麼錯。我知道有類似的問題,但找不到解決方案。幫我找到一種方法來使它工作

+1

可能的重複[如何從異步調用返回響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-電話) –

+1

@JarrodRoberson:以上不是異步的。可悲的是。 –

+0

@JarrodRoberson:問題在於我無法返回on.foreunload事件的值作爲T.J. Crowder在下面指出。 – sandeep

回答

0

你沒有從你的onbeforeunload函數返回字符串。你從then回調中返回。

您需要設置您使用從主函數,而不是返回一個變量:

window.onbeforeunload = function(e) { 
    var result = undefined; 
    $.when($.ajax({ 
     url: checkUrl, 
     async: false, 
     type: 'GET', 
    })).then(function(data, textStatus, jqXHR){ 
     if(data===false) { 
      result = "Appointment not created yet. Do you wish to leave?"; 
     } 
    }); 
    return result; 
}; 

邊注:有沒有必要在該$.when,您可以使用「承諾」通過$.ajax直接返回:

window.onbeforeunload = function(e) { 
    var result = undefined; 
    $.ajax({ 
     url: checkUrl, 
     async: false, 
     type: 'GET', 
    }).then(function(data, textStatus, jqXHR){ 
     if(data===false) { 
      result = "Appointment not created yet. Do you wish to leave?"; 
     } 
    }); 
    return result; 
}; 

邊注2:在這裏插入平時筆記關於Ajax如何同步塊瀏覽器的UI。如果您正在進行預約創建,當您開始創建預約時,您可以設置客戶端變量,然後在完成後清除它,並使用它來知道是否顯示消息?

附註3:現代瀏覽器忽略您返回的消息,只顯示一些通用的東西。我不是說你應該改變任何東西(因爲現在還有一些東西顯示它),只是提到它,所以你不要試圖弄清楚爲什麼你會收到一條消息,但不是你的信息。

附註4:您的then回調只會收到一個參數。您列出的三個參數是傳遞給success回調的參數,而不是then回調。

+0

感謝您的反饋。有用。但它只適用於IE。在Chrome中,如果我打開了調試器(開發人員工具),它將起作用。你能提出任何關於這個的建議嗎 - @ T.J。 Crowder – sandeep

+0

@sandeep:是的:我的建議是不要嘗試從'onbeforeunload'做同步ajax。它無法可靠地跨瀏覽器工作,並且當用戶在ajax調用未決時試圖離開時鎖定瀏覽器的用戶界面是錯誤的。正如我上面所說的,如果你有一個正在進行的操作,你可以在用戶試圖離開時不用進行同步ajax調用來標記這個操作。 –

+0

那麼,實際上約會創建發生在另一個系統中,除了進行Web服務調用外,沒有其他方式可以確定它。是否有任何插件能夠更好地完成上述操作。謝謝@ T.J。 Crowder – sandeep

相關問題