2010-05-07 176 views
22

我有一個JavaScript Ajax調用(jQuery.ajax),它不執行成功回調函數。jQuery.ajax成功回調函數不執行

$.ajax({ 
     url: target, 
     contentType: 'application/json; charset=utf-8', 
     type: 'POST', 
     // type: 'GET', 
     dataType: 'jsonp', 
     error: function (xhr, status) { 
      alert(status); 
     }, 
     success: function (result) { 
      alert("Callback done!"); 
      // grid.dataBind(result.results); 
      // grid.dataBind(result); 
     } 
    }); 

我在firebug中看到,請求已發佈,並且按照預期返回了json方面的正確結果。哪裏不對?

+3

一個問題我已經看到了,可能會導致該方案是如果託管的網頁和Ajax目標是在不同的領域。 – artlung 2010-05-07 08:30:28

+0

http://stackoverflow.com/questions/21368375/why-does-jquery-ajax-call-only-work-when-im-debugging-in-chrome 這個作品嚐試它爲我工作 – 2014-04-25 12:12:22

回答

44

很多時候我遇到過類似的問題,而且大部分時候,原因都是畸形的json。嘗試將結果作爲文本數據類型來查看這是否是您的問題。

此外,我想問你是否使用了像「& jsoncallback =?」這樣的參數。在你的網址中,因爲你的數據類型是jsonp而不是簡單的json。

+8

我有相同類型的問題,主要是格式錯誤的json。在jsonlint.com驗證您的JSON響應 – Adeel 2010-05-07 11:24:39

+1

我驗證了它的有效JSON。 – 2010-05-07 12:31:38

+1

json而不是jsonp解決了它。謝謝。 – 2010-05-07 13:31:38

5

$.ajax電話與dataType: 'jsonp'可以在這些情況下工作:

  1. 要調用你的頁面的同一個域的URL。
  2. 要調用一個URL你的網頁的域名支持callback

如果你出的這兩種情況下,你不能做任何事情,因爲你不能使跨站點的XmlHttpRequest調用的。

+0

其實, 您可以;至少在現代瀏覽器中。不過,我不認爲$ .ajax可以處理這個問題。 – Tgr 2010-05-07 08:59:21

+1

無論如何,如果它是一個跨站點請求,AJAX調用不會首先返回。 – Tgr 2010-05-07 09:01:18

+0

@Tgr你確定嗎?jquery Ajax跨域調用切換到Jsonp,用回調函數名替代?在您的回調網址參數上調用網址並在頁面標題中添加

1

這是一個古老的問題,但我懷疑人們仍然打這個。

我爲此奮鬥了一段時間,最終放棄並轉移到延期模型。 (我一直使用jQuery的時間足夠長,以至於我仍然處於「舊」的習慣......)當我轉向延期模型時,事情就開始奏效。我不知道爲什麼舊的方式不起作用,但不再在意。 (這個問題是在新模型之前發佈的。)

參考https://stackoverflow.com/a/14754681/199172

-1

即使調用成功,Jquery Ajax調用具有多參數的servlet也不會調用成功或錯誤。它被綁定到一個提交按鈕。改變它返回了一個成功事件。

這是我的參考代碼,以防有人需要它作爲參考。

$(document).ready(function() {  
    $("#buttonSave").click(function() { 
     alert('incustsave'); 
     var name = $("#custname").val(); 
     var gstnumber = $("#gstnumber").val(); 
     var custbizname = $("#custbizname").val(); 
     var email = $("#email").val(); 
     var address = $("#address").val(); 
     var street = $("#street").val(); 
     var city = $("#city").val(); 
     var zip = $("#zip").val(); 
     var phone = $("#phone").val(); 
     var country = $("#ctry").val(); 

     var inputArray = [name, gstnumber, custbizname, email, address, street, city, zip, phone, country]; 
     var Success = false; 
     alert('added_button_and_dt'); 
     $.ajax({ 
      type: "POST", 
      url: "RegisterCustomerServlet",    
      data: {'input': inputArray}, 
      dataType: 'json', 

      success: function (data) { 
       alert('sucess'); 
      }, 
      error: function (e) { 
       alert('error'); 
      } 
     }); 
    }); 
}); 

HTML與Bootstrap3(按鈕參考)

<!-- Button --> 
<div class='wrapper text-center'> 
    <div class="btn-group"> 
     <button type="button" id="buttonSave" class="btn btn-primary">Save</button> 
    </div> 
</div> 

Servlet的參考

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    HashMap<String,String> map = new HashMap<String,String>(); 
    CustomerDAO custinfo = new CustomerDAO(); 
    Gson gson = new Gson(); 
    CustomerVO vo = new CustomerVO(); 

    String[] myJsonData = request.getParameterValues("input[]"); 
    logger.info("in custregisterjsoninput" + myJsonData[0] + myJsonData[2] + myJsonData[3] + myJsonData[4]); 

    map.put("custname", myJsonData[0]); 
    map.put("getsnumber", myJsonData[1]); 
    map.put("custbizname", myJsonData[2]); 

    map.put("email", myJsonData[3]); 
    map.put("address", myJsonData[4]); 
    map.put("street", myJsonData[5]); 
    map.put("city", myJsonData[6]);   
    map.put("pincode", myJsonData[7]); 
    map.put("mainphone", myJsonData[8]); 
    map.put("country", myJsonData[9]); 

    try { 
     vo = custinfo.saveCustomerInfo(map); 
    } catch (Exception e) { 
     logger.info("aftercall"+e.getMessage()); 
     throw new ServletException(e); 
    } 
    response.setContentType("application/json"); 
    response.setCharacterEncoding("UTF-8"); 
    response.getWriter().write(Utility.convertPOJOtoJason(vo)); 
}