2010-10-18 24 views
2

Avoir un ensemble de code ajax activé par le prototype qui fonctionne dans tous les navigateurs autres que IE. Dans IE8, le JSON, qui sinon est renvoyé à la fonction de gestionnaire onSuccess spécifiée dans Ajax.Request, est jeté dans un flux de téléchargement de fichier qui apparaît et vous invite à indiquer où télécharger.Problème avec le prototype Ajax.Request dans Internet Explorer 8 téléchargement de fichier d'invite

askForm = $('askForm'); 
var askUrl = '.'; 
var askParameters = askForm.serialize(true); 
askForm.disable(); 

var askAjax = new Ajax.Request(
    askUrl, { 
    method: 'post', 
    parameters: askParameters, 
    onSuccess: handleResults, 
    onFailure: handleError 
    } 
); 

function handleError(transport) { 
    alert('Please refresh this page, an error occurred in processing at the server.'); 
} 

function handleResults(transport) { 
... 
} 

Il y a plus de code dans la fonction handleResults, mais il n'est jamais appelé. Après avoir débogué, l'invite de téléchargement se produit lorsque la fonction Ajax.Request est appelée.

Le nom de fichier IE8 vous invite à télécharger les modifications à chaque fois, 4 valeurs hexadécimales apparemment aléatoires (8 caractères) sans extension de nom de fichier. Et le contenu du fichier est la réponse pure JSON du serveur ...

{"question": ["Enter your question*"], "name": ["Enter your name (First L.)*"], "sender": ["Enter your e-mail*"]} 

serait beaucoup obligé pour tous les conseils ici. Cela se produit sur Snow Leopard avec IE8 fonctionnant dans VMWare Fusion accédant à un site fonctionnant via apache/django/python sur OS X. Cependant, depuis Chrome et Firefox dans la machine VMWare Windows XP fonctionne correctement, semble pointer directement sur IE8 comme le coupable .

Répondre

3

Ce problème a été résolu. Problème fou ici, mais il se trouve qu'il y avait une erreur javascript qui empêchait l'exécution du script et la soumission de formulaire standard se produisait à travers le navigateur retournant ainsi le code AJAX comme une invite de téléchargement de fichier. Le formulaire a été conçu de manière à ce que les navigateurs désactivés par javascript puissent toujours utiliser le formulaire sans ajax en utilisant un champ de saisie caché avec le nom "js". Le javascript viderait la valeur de ce champ lors de la soumission via AJAX pour indiquer au serveur que la réponse devrait être JSON et non une actualisation complète de la page. Eh bien, la partie du javascript qui a masqué la valeur du champ js a été traitée normalement, mais le script a ensuite été éjecté et le javascript event.stop() n'a jamais été exécuté. Il en résulte que le formulaire est traité comme un bouton Soumettre standard, une demande POST via un navigateur.

Remarque dans le code ci-dessus ...

askForm = $('askForm'); 

qui devrait clairement être ...

var askForm = $('askForm'); 

Merci aux navigateurs qui ont permis à cette syntaxe, mais il m'a envoyé sur une oie sauvage IE8 poursuivre en conséquence. Toujours entrain d'apprendre.

0

Le fichier côté serveur qui envoie le fichier JSON au navigateur envoie-t-il les en-têtes appropriés? S'il ne s'identifie pas comme JSON, le navigateur peut considérer qu'il s'agit d'un fichier à télécharger.

+0

La réponse est envoyée à l'aide de l'objet django.http.HttpResponse spécifiant mimetype = "text/javascript" - Peut-être que je devrais envisager de modifier cela ou d'ajouter d'autres en-têtes? – sansjoe

+0

Addendum: Juste essayé mime-type comme 'application/json' avec aucun changement dans le comportement de IE8. – sansjoe