2010-05-07 2 views
22

У меня есть JavaScript-вызов Ajax (jQuery.ajax), который не выполняет функцию обратного вызова успеха.Функция jQuery.ajax success callback не выполнена

$.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); 
     } 
    }); 

Я вижу в поджигатель, что запрос отправлен и правильный результат с точки зрения JSON возвращается, как и ожидалось. Что не так?

+3

Одна проблема, которую я видел, что может привести к такого сценария являются, если размещается страница и целевой Аякса являются на разных доменах. – artlung

+0

http://stackoverflow.com/questions/21368375/why-does-jquery-ajax-call-only-work-when-im-debugging-in-chrome это работает попробовать это сработало для меня –

ответ

44

Во многих случаях я сталкивался с подобными проблемами, и большую часть времени причиной был неправильный json. Попробуйте получить результат в виде текстового типа, чтобы узнать, является ли это вашей проблемой.

Кроме того, я хотел бы спросить, используете ли вы параметр «& jsoncallback =?» в вашем URL-адресе, так как ваш тип данных - jsonp вместо простого json.

+8

У меня были проблемы с одним и тем же типом, и в основном это был неправильный json. Подтвердите свой ответ JSON на jsonlint.com – Adeel

+1

Я подтвердил, что он действителен JSON. –

+1

json вместо jsonp решил это. Благодарю. –

5

Ваш $.ajax вызов с dataType: 'jsonp' может работать в этих сценариях:

  1. Вы вызываете URL на том же домене вашей страницы.
  2. Вы вызываете URL из вашего домена вашей страницы, которая поддерживает callback

Если вы из этих двух случаев, вы не можете ничего сделать, так как вы не можете сделать перекрестный сайт XmlHttpRequest называет.

+0

На самом деле , ты можешь; по крайней мере, в современных браузерах. Я не думаю, что $ .ajax обрабатывает это. – Tgr

+1

В любом случае, если это будет запрос на межсайтовый сайт, вызов AJAX не будет возвращаться в первую очередь. – Tgr

+0

@Tgr вы уверены? Переключатель перекрестных доменов JQuery Ajax переключается на Jsonp, заменяет имя функции обратного вызова на? на вашем параметре urback обратного вызова и вызывает URL-адрес, добавляющий в заголовок страницы тег

1

Это старый вопрос, но я подозреваю, что люди все еще попадают в него.

Я боролся с этим некоторое время и в конце концов сдался и перешел на отложенную модель. (Я использую jQuery достаточно долго, чтобы привыкнуть к привычным привычкам ...) Как только я перешел на отложенную модель, все стало работать. Я понятия не имею, почему старый способ не сработал, но больше не волнует. (Этот вопрос предваряет новую модель.)

ср. https://stackoverflow.com/a/14754681/199172

-1

Jquery Ajax вызов сервлета с параметрами mutliple не вызывал успеха или ошибки, даже несмотря на то, что вызов был успешным. Он был связан с кнопкой отправки. Изменение этого результата привело к успешному событию.

Вот мой ссылочный код на тот случай, если кому-то это понадобится для справки.

$(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)

<!-- 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)); 
} 
Смежные вопросы