2011-08-30 61 views
3

我對jQuery ajax成功處理程序有困難。在成功處理程序中發生的任何JavaScript運行時錯誤都不會被報告(Firefox錯誤控制檯中不會顯示任何錯誤)。並嘗試調試沒有錯誤通知讓我瘋狂。有人可以看看下面我的代碼的簡化版本,讓我知道我是否在做一些可能導致問題的蠢事。jQuery ajax中的錯誤沒有得到報告

如果沒有,如果有人可以在Firefox中測試這個,並確認(或不),沒有錯誤消息出現,它不只是我生氣(或者我的Firefox安裝有什麼問題或什麼)。我也把代碼在網絡上 - 這樣你就可以直接點擊下面來測試它....

http://www.alisonstrachan.co.uk/tests/ajax2/ajax_test2.html

ajax_test2.html

<html> 
<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.js"></script> 
<script type="text/javascript"> 

$(document).ready(function(){ 

    //alert(missingVariable1);   //uncomment -> get error reported (as expected) 

    $.ajax({ 
     url: "ajax_test2_process.php", 
     data: {send: "hello"}, 
     async: false, 
     success: function(data){ 
      $("#results").append(data); 
      alert(missingVariable2);  //no error reported (there should be surely?) 
      $("#results").append(" finished "); 
      } 
     }); 
}); 

</script> 
</head> 
<body> 
<div id="results"></div> 
</body> 
</html> 

ajax_test2_process.php

<?php 
    echo "received: " . $_REQUEST['send']; 
?> 
+0

到您重定向正在顯示的頁面'收到:hello'是不是想要的結果 – Rafay

+0

@ 3nigma感謝測試了這一點。是的,這是預期的結果。但是我需要知道的是你在Firefox錯誤控制檯中得到了什麼。故意在您的控制檯中隱藏「alert()」錯誤? –

+0

也許ajax請求失敗,因此永遠不會調用成功,試圖通過完成更改成功,使用FIREBUG – max4ever

回答

1

我的猜測是,由於jQuery wrapping the callback in a try...catch,這是默默的失敗。

所以,簡單地說,在回調函數中發現的任何錯誤或錯誤代碼只會默默地失敗(並且冒泡到我所概述的try ... catch),然後停止它處理的位置。

+0

謝謝。這就說得通了。但是這肯定會讓調試成爲一場噩夢。還是有更好的調試方法。我錯過了什麼嗎? –

+0

@macrae_dj:可能會在回調的底部放置一個'console.log('ajax complete');'以驗證回調已經完全執行了嗎?我通常基於我想要做的所有事情看起來像是執行(良好的呼叫)或檢查是否有任何行動(壞呼叫)。 –

+0

在我的真實項目中,我在成功回調中使用了大量的javascript。我試圖弄清楚如何「跳出」try/catch,因爲我真的需要調試。我雖然也許使用'setTimeout(continueSuccessHandler,1)'或什麼的。不知道是否有更優雅的東西? –

0

查看Ajax函數的其他回調函數on(http://api.jquery.com/jQuery.ajax/) - 你可能想看看errorstatusCode - Firebug對於調查與Ajax相關的問題也非常有用 - 你可以看到post和響應阿賈克斯通訊。

如果你想登錄到Firebug控制檯使用console.log('text');

1

這可能是由於Adblock Plus的或類似的擴展名(請檢查您是否安裝了擴展),見bug 653533

+0

在安全模式下運行Firefox時(所有擴展都無法使用),我得到的結果相同。 –

0

你也可以嘗試像jquery docs對象包裹你的Ajax提示:

var jqxhr = $.ajax({ url: "example.php" }) 
    .success(function() { alert("success"); }) 
    .error(function() { alert("error"); }) 
    .complete(function() { alert("complete"); });