web-dev-qa-db-fra.com

fonction de rappel de réussite jQuery.ajax non exécutée

J'ai un appel JavaScript Ajax (jQuery.ajax), qui n'exécute pas la fonction de rappel de réussite. 

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

Je vois dans firebug que la demande est publiée et que le résultat correct en termes de json est renvoyé comme prévu. Qu'est-ce qui ne va pas?

26

Plusieurs fois, j'ai rencontré des problèmes similaires et la plupart du temps, la raison en était un JSON mal formé. Essayez d’obtenir le résultat sous forme de type de données texte pour voir s’il s’agit de votre problème.

De plus, j'aimerais vous demander si vous utilisez un paramètre tel que "& jsoncallback =?" dans votre URL, puisque votre type de données est jsonp au lieu de simple json.

50
Cagdas

Votre appel $.ajax avec dataType: 'jsonp' pourrait fonctionner dans les scénarios suivants:

  1. Vous appelez une URL sur le même domaine de votre page.
  2. Vous appelez une URL de votre domaine de votre page qui prend en charge callback

Si vous n’êtes pas dans ces deux cas, vous ne pouvez rien faire car vous ne pouvez pas effectuer d’appels XmlHttpRequest entre sites.

6
systempuntoout

C'est une vieille question, mais je soupçonne que les gens continuent de frapper.

Je me suis battu pendant un certain temps et ai finalement abandonné pour passer au modèle différé. (Je me sers de jQuery depuis assez longtemps pour retrouver mon "ancien" comportement habituel ...) Dès que je suis passé à un modèle différé, tout a commencé à fonctionner. Je ne sais pas pourquoi l'ancienne méthode ne fonctionnait pas, mais je m'en foutais. (Cette question est antérieure au nouveau modèle.)

cf. https://stackoverflow.com/a/14754681/199172

2
MikeBaz - MSFT

Vous devez définir la propriété async sur false.

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

C'est ce qui est arrivé à l'un de mes collègues, alors je pense que j'ajouterais aussi ma solution.

Nous pouvions voir l'appel ajax être passé et voir la réponse appropriée revenir dans Fiddler (statut 200/JSON complètement valide), mais cela ne toucherait jamais l'erreur, le succès ou les rappels complets. L'ajout de async: false à l'appel ajax le ferait fonctionner, mais ce n'était pas vraiment une solution appropriée. De plus, le fait de placer une alerte directement après l'appel ajax (sans l'async: false) et d'attendre quelques secondes une fois l'alerte affichée forcerait en quelque sorte les rappels ajax à fonctionner. Très étrange en effet ...

Il s'avère que la fonction avec l'appel ajax était liée à une entrée de type = "submit", source de ce comportement étrange. Changer l'entrée en type = "button" l'a corrigé.

0
Xorcist