El evento de éxito de Ajax no funciona

193

Tengo un formulario de registro y lo estoy utilizando $.ajaxpara enviarlo.

Esta es mi solicitud AJAX:

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

En mi archivo submit1.php verifico la existencia de campos de dirección de correo electrónico y nombre de usuario en la base de datos. Deseo mostrar un mensaje de error si esos valores existen sin una actualización de la página .

¿Cómo puedo agregar esto a la devolución de llamada exitosa de mi solicitud AJAX?

codingbbq
fuente
2
¿Está seguro de que se invoca la devolución de llamada correcta?
rahul
Necesita hacer una nueva pregunta para su segundo problema.
Mike Lyons

Respuestas:

386

El resultado probablemente no esté en formato JSON, por lo que cuando jQuery intenta analizarlo como tal, falla. Puede detectar el error con la error:función de devolución de llamada.

De todos modos, no parece necesitar JSON en esa función, por lo que también puede eliminar la dataType: 'json'fila.

Tatu Ulmanen
fuente
14
Cambié el tipo de datos a texto y lo hice funcionar. asídataType:'text'
Magesh
+1 incluso mi, pero en un código que no era mío, lo resolví devolviendo datos json del servidor
albanx
44
Esto también puede ocurrir si dataType:no se especifica a, pero url:termina en .json.
davetapley
1
También en el $.postsuministro de alias jsoncomo tipo de datos sin json real proveniente del servidor no desencadena la successdevolución de llamada
baldrs
Si desea realizar una solicitud json ajax, asegúrese de que mime-type esté configurado en application / json. Eso me dio algunos problemas.
Gellweiler
19

Aunque el problema ya está resuelto, agrego esto con la esperanza de que ayude a otros.

Cometí el error e intenté usar una función directamente como esta (éxito: OnSuccess (productID)). Pero primero debe pasar una función anónima:

  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

Si no utiliza una función anónima como envoltorio, se llama a OnSuccess incluso si el servicio web devuelve una excepción.

js newbee
fuente
55
esto no tiene nada que ver con ajax, ni jquery, ni manejadores. También podríamos tener un comentario que recuerde que "todo el código debe estar envuelto en una etiqueta de script". La explicación es falsa: no tiene que envolver nada en funciones anónimas, una función con nombre lo hará, siempre que la pase en lugar de llamarla. Además, es engañoso: se llama a OnSuccess incluso antes de que se envíe la solicitud, por lo que no tiene sentido relacionarla con el servicio web que devuelve algo.
fdreger
Esta respuesta me ayudó, pero no voté, debería actualizar su respuesta de acuerdo con el comentario de @fdreger.
Ozair Kafray
15

Intenté eliminar la fila dataType y no funcionó para mí. Eludí el problema usando "complete" en lugar de "éxito" como devolución de llamada. La devolución de llamada exitosa todavía falla en IE, pero dado que mi script se ejecuta y completa de todos modos, eso es todo lo que me importa.

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

en jQuery 1.5 también puedes hacerlo así.

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});
Allen
fuente
9
Solo una nota para esto. completesiempre se llamará independientemente de si la llamada ajax fue exitosa o no, mientras que successsolo se llamará si el servidor web responde con un 200 OKencabezado HTTP (todo está bien).
katalin_2003
10

Asegúrese de que no está imprimiendo (echo o print) ningún texto / dato antes de generar sus datos formateados JSON en su archivo PHP. Eso podría explicar que obtienes un -sucessfull 200 OK- pero tu evento de éxito aún falla en tu javascript. Puede verificar qué está recibiendo su script al consultar la sección "Red - Respuesta" en firebug para POST submit1.php.

Delfin
fuente
Esto realmente me ayudó. Sé que es una respuesta antigua, pero fue exactamente el problema que había tenido. Usando echo's o print_r's durante la depuración y descubriendo que realmente causan el error ... :) ¡Gracias!
lennyklb
¡6 años después y sigo ayudando a la gente con esta respuesta! No habría sabido dónde buscar de otra manera.
Tania Rascia
5

Ponga un alert()en su successdevolución de llamada para asegurarse de que se está llamando.

Si no es así, es simplemente porque la solicitud no tuvo éxito en absoluto, a pesar de que logras llegar al servidor. Las causas razonables pueden ser que expire un tiempo de espera o que algo en su código php arroje una excepción.

Instale el complemento firebug para firefox, si aún no lo ha hecho, e inspeccione la devolución de llamada AJAX. Podrá ver la respuesta y si recibe o no una respuesta exitosa (200 OK). También puede poner otro alert()en la complete devolución de llamada, que definitivamente debe invocarse.

David Hedlund
fuente
Gracias por su respuesta. Intenté alerta en caso de éxito pero no funcionó. Tengo el complemento firebug para firefox y recibe una respuesta exitosa (200 OK), así que no hay problemas allí. Tengo una función de matriz llamada en mi archivo php para detectar cualquier error y cuando lo reviso en firebug, muestra la respuesta adecuada. ¿Qué quieres decir con "También puedes poner otra alerta () en la devolución de llamada completa, que definitivamente debería invocarse"? Muchas gracias por una respuesta rápida
codingbbq
2
Si no ve la alerta en su success, entonces no es un éxito. Dado que la respuesta es 200 OK, la respuesta de Tatu parece razonable, pero para una mayor resolución de problemas, puede usar otro evento, llamado completeque siempre se invoca, independientemente de si una solicitud es exitosa o no ( successsolo ocurre si la solicitud es exitosa). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund
3

Tuve el mismo problema sucede porque se javascriptespera jsonque el tipo de datos devuelva datos. pero si usas echo o print en tu php esta situación ocurre. Si utiliza la echofunción phppara devolver datos, simplemente elimine el dataType : "json"trabajo bastante bien.

Así, Wickramasinghe
fuente
2

Estaba devolviendo JSON válido, obteniendo una respuesta de 200 en mi devolución de llamada "completa", y podía verlo en la consola de red de Chrome ... PERO no había especificado

dataType: "json"

una vez que lo hice, a diferencia de la "respuesta aceptada", eso solucionó el problema.

sarink
fuente
1

Estoy usando XML para llevar el resultado desde el php en el servidor a la página web y he tenido el mismo comportamiento.

En mi caso, la razón fue que la etiqueta de cierre no coincidía con la etiqueta de apertura.

<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>
Thowa
fuente
1

Tuve este problema al usar una función ajax para recuperar la contraseña de usuario de Magento. El evento de éxito no se estaba disparando, luego me di cuenta de que había dos errores:

  1. El resultado no se devolvió en formato JSON
  2. Estaba tratando de convertir una matriz a formato JSON, pero esta matriz tenía caracteres no utf

Entonces, cada vez que traté de usar json_eoncde () para codificar la matriz de retorno, la función no funcionaba porque uno de sus índices tenía caracteres no utf, la mayoría de ellos acentuándose en palabras portuguesas brasileñas.

Andresa Martins
fuente
1

Traté de devolver la cadena del controlador, pero ¿por qué el control que regresa al bloque de error no es exitoso de ajax?

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});
usuario7285134
fuente
1

Enfrenté el mismo problema al consultar el controlador que no devuelve una respuesta de éxito, cuando se modificó mi controlador para devolver el problema del mensaje de éxito. nota utilizando el marco Lavalite. antes de:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

esto funcionó para mí

masokaya
fuente
1

Tuve el mismo problema, lo resolví de esa manera: Mi ajax:

event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}), 
success: function(php_response){
            if (php_response == 'item') 
                {
                    console.log('it works');
                }
            }
        })

Okay. El problema no es con json sino solo con la respuesta de php. Antes: mi respuesta de php fue:

echo 'item';

Ahora:

$variable = 'item';
 echo json.encode($variable);

Ahora mi éxito trabajando. PD. Lo siento si algo está mal pero es mi primer comentario en este foro :)

Silkykg
fuente
0

en mi caso el error fue que esto estaba en el lado del servidor y por eso estaba devolviendo un html

wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");
Emiliano Barboza
fuente
0

Agregue la devolución de llamada de 'error' (al igual que 'éxito') de esta manera:

$.ajax({
   type: 'POST',
   url: 'submit1.php',
   data: $("#regist").serialize(),
   dataType: 'json',
   success: function() {
      $("#loading").append("<h2>you are here</h2>");
   },
   error: function(jqXhr, textStatus, errorMessage){
      console.log("Error: ", errorMessage);
   }
});

Entonces, en mi caso, vi en la consola:

Error:  SyntaxError: Unexpected end of JSON input
  at parse (<anonymous>), ..., etc.
Vlado
fuente
0

Debe declarar la devolución de llamada de éxito y error. Agregando

error: function(err) {...} 

debería solucionar el problema

JeffNhan
fuente
-4

La devolución de llamada exitosa toma dos argumentos:

success: function (data, textStatus) { }

También asegúrese de que submit1.phpestablece el encabezado de tipo de contenido adecuado:application/json

Darin Dimitrov
fuente
Gracias por su respuesta. Leí sobre esto en la documentación de jquery ajax, pero no puedo entender cuál debería ser mi próximo paso para que funcione ... te agradecería si me indicaras la dirección correcta. ¿También significa que debería tener algún código específico en mi archivo php? muchas gracias
codingbbq
77
El hecho de que successtome dos argumentos parece completamente irrelevante para la pregunta. Puede pasar cualquier cantidad de parámetros a una función de JavaScript, independientemente de cuántos acepte en su declaración, por lo que definitivamente no es la causa de estos problemas, y dado que ninguno de los valores datao textStatusse están utilizando en la devolución de llamada exitosa, parece que No hay una buena razón para declararlos en la función.
David Hedlund
Y los datos JSON no tienen que tener un encabezado de tipo de contenido correcto, solo tienen que estar en formato JSON.
Tatu Ulmanen