2012-09-25 1 views
2

J'ai une application Web qui se connecte à un autre service Web et peut effectuer certaines actions pour un utilisateur. J'utilise codeigniter et jQuery. J'ai mis en place un contrôleur en codeigniter spécifiquement pour gérer les requêtes ajax. Le contrôleur fait tout ce dont il a besoin, puis echo sson. L'appel ajax ci-dessous est censé prendre le nom d'utilisateur et le mot de passe pour l'autre service Web et les envoyer à mon contrôleur ajax. Le contrôleur utilise les valeurs pour tenter de se connecter à l'autre service (en utilisant curl). La réponse de JSON reflète si la connexion a été réussie ou non.jQuery La réponse ajax s'affiche dans le navigateur au lieu d'être transmise à la fonction de rappel

Mon problème est que parfois mon navigateur est redirigé vers le contrôleur ajax, donc la réponse json est echo ed au navigateur. Je ne peux pas identifier pourquoi ou quand cela se produit. Lorsque cela se produit, la fonction success n'est pas appelée.

/* Verify login credentials 
* 
* @param username, password 
* @param activityElement - element in which to place activity indicator 
* @param location - location to refresh after success 
* @return none 
*/ 
function verify_login(username, password, activityElement, location) 
{ 
    $.ajax({ 
     type: 'POST', 
     url: '<?=site_url('ajax/eval_login')?>', 
     data: { username: username, password: password }, 
    beforeSend:function() { 
     window.savedHtml = $(activityElement).html(); 
     $(activityElement).html('<div id="activity"></div><div class="text-center">Verifying </div>'); 
     $('#activity').activity(); //neteye activity indicator plugin 
    }, 
    success:function(data) { 
     data = $.parseJSON(data); 
     if (data.success) { 
      $(activityElement).html(window.savedHtml); 

      //fades in success message then performs function 
      set_message('Success!',function() { 
       alert(location); 
       window.location.href = "<?=site_url()?>/" + location; 
      }); 
     } else { 
      $(activityElement).html(window.savedHtml); 
      set_message(data.error); 
     }  
     $('#activity').activity(false); 
     set_clicks(); 
    }, 
    error:function(){ 
     set_message('<strong>Oops!</strong> Try that again in a few moments.</p>'); 
     $('#activity').activity(false); 
     $(activityElement).html(window.savedHtml); 
    } 
    }); 
} 

Modifier: Je suis assez confus. Je ne semble pas vraiment la demande ajax est la question ... n'a pas de sens pour moi

marchant à travers elle à nouveau ..

  1. demande est envoyée avec le .ajax appel
  2. parfois tout fonctionne comme prévu (la demande revient, ui est mis à jour)
  3. parfois le navigateur va juste à http://yadayada.local/index.php/ajax/eval_login où la bonne réponse json est affichée (voir la capture d'écran ci-dessous ..). Il est intéressant que la réponse correcte de JSON soit affichée. Si le navigateur était simplement redirigé il n'y aurait pas de sortie depuis $_POST serait vide ...

screenshot http://i45.tinypic.com/111nyhl.png

+0

Par ailleurs le rappel 'beforeSend' n'est pas destiné à jouer avec l'interface utilisateur, mais pour accéder aux en-têtes de la requête brute avant l'envoi - il suffit de mettre ces lignes après l'appel ajax. – moonwave99

+0

Installez le plugin HTTP Headers pour FF et laissez-le "toujours en haut". Vous serez en mesure d'enregistrer toutes les demandes et réponses. Avec un peu de chance, vous comprendrez où est le problème. – martincho

Répondre

1

Le problème était que j'avais indiqué l'action de forme au contrôleur ajax pour une raison quelconque et que event.preventDefault() ne fonctionnait que parfois. Je ne peux pas croire que je l'ai fait .. Je suppose que je l'ai mérité pour la logique bâclée

+0

Si cela a résolu votre problème, vous devriez l'accepter comme votre réponse afin d'aider les autres qui pourraient trouver ce poste. –

+0

@ Miguel-F SO ne me laisse pas accepter ma propre réponse pour 23 heures de plus :) – RyanM

1

J'utiliser votre navigateur inspecteur de réseau pour examiner la réponse à l'une des demandes ayant échoué, ce peut faire la lumière sur un problème dans la réponse de vos applications.

@voyez http://docs.jquery.com/Ajax_Events "Cet événement est appelé uniquement si la requête a abouti (aucune erreur du serveur, aucune erreur avec les données)." Par conséquent, le code de réponse ou les données de réponse provoquent l'échec de ce code.

+0

Hey lotsofcode.Firebug ne me donne pas beaucoup à travailler, juste une erreur qui dit "Le codage de caractères du document HTML n'a pas été déclaré." ce qui est logique depuis son juste json. Il n'est même pas afficher les détails de la poste si – RyanM

0

Je ne pense pas que vous avez besoin de cette ligne:

data = $.parseJSON(data); 

Essayez de l'exécuter sans elle.

+2

Vous devez en effet, si vous ne demandez pas le format 'json'. – moonwave99

+0

@ moonwave99, bon à savoir, merci. –

Questions connexes