2010-01-11 3 views
1

J'ai un simple script Ajax qui fonctionne parfaitement bien dans Chrome, Internet Explorer 8, Firefox 3.5.5 mais échoue dans Firefox 3.5.7. Le code est le suivant:jQuery réponse Ajax échoue dans Firefox 3.5.7

HTML Page:

<div> 
    <form> 
    <input id='button' type='button' value='click'> 
    </form> 
</div> 

<script> 
    $(document).ready(function(){ 
    $("#button").click(function(){ 
     $.ajax({ 
     type: "POST", 
     url: HTTP_HOST+"/ajax/ajax.php", 
     data: 'source=test', 
     dataType: 'html', 
     success: function(data) {alert('success: '+data);}, 
     error: function(XMLHttpRequest, textStatus, errorThrown){alert('fail:\n'+ 
                   textStatus+'\n'+ 
                   errorThrown+'\n' 
                   );} 
     }); 
    }); 
    }); 
</script> 

page ajax.php:

$sourcePage = $_POST['source']; 
if($sourcePage == 'test'){ 
    echo 'hello'; 
} 

je reçois la réponse attendue (une boîte d'alerte disant 'succès: bonjour') dans le les navigateurs que j'ai mentionnés ci-dessus. Dans Firefox 3.5.7, cependant, je reçois la boîte d'alerte avec 'fail: error undefined'. Utilisation du panneau Net Firebug Je peux voir les appels Ajax et ils obtiennent une valeur de réponse de 200 OK bien qu'il ne puisse pas sembler distinguer la taille de la réponse.

Il n'y a pas d'autres erreurs selon Firebug. Basé sur l'appel Ajax apparemment réussi et la taille indéfinie de la réponse, je suppose que Firefox a du mal à interpréter la réponse bien que je sois nouveau à ceci et n'ai aucune idée quoi essayer.

Comment puis-je résoudre ce problème?

Répondre

3

J'ai trouvé quel était le problème. Fondamentalement ce qui se passait est ma page HTML avait une adresse de http://domain.com.au/testPage.php mais mon Ajax appelait http://www.domain.com.au/ajax.php. Il doit y avoir un certain type de paramètre de sécurité qui se plaint lorsque vous essayez de faire un appel Ajax à un domaine différent? Donc, si j'accède à la page http://www.domain.com.au/testPage.php alors cela fonctionne. Aussi, si je change l'Ajax pour appeler http://domain.com.au/ajax.php sans www, et faire l'appel de http://domain.com.au/testPage.php qui fonctionne également.

Fondamentalement, assurez-vous que le sous-domaine de votre page est le même que le sous-domaine de la page que vous demandez avec Ajax.

Cela pourrait potentiellement être un gros problème pour les personnes qui ne s'en rendent pas compte car beaucoup de paquets d'hébergement (comme le mien) vous serviront la même page avec ou sans le sous-domaine www par défaut. En tant que tel, il est possible pour moi d'accéder à toutes mes pages avec ou sans le www et ne pas remarquer une différence (sauf que Ajax ne fonctionnera pas).

Il semble que les autres navigateurs ont le même problème qui signifie qu'il était un coup de chance terrible à chaque fois que je l'ai testé Firefox (sur 5 systèmes différents) Je en quelque sorte fini par essayer l'URL sans www :(

Je vais devoir trouver un moyen de forcer tout le monde à utiliser le sous-domaine www.je crois que http://www.thesitewizard.com/apache/redirect-domain-www-subdomain.shtml#domaintosub est ce que je cherche

+0

Oh oui qui le ferait .. vous êtes sandboxed à un seul domaine avec ajax sauf si vous appelez l'appel. – prodigitalson

1

EDIT:

Essayez de changer dataType-'text'.

essayer dans votre ajax.php:

$sourcePage = isset($_POST['source']) ? $_POST['source'] : 'NO SOURCE'; 

if($sourcePage == 'test'){ 
    echo 'hello'; 
} 
else 
{ 
    echo $sourcePage; 
} 
+0

J'ai essayé cela mais le problème persiste. Bien que cela fonctionne dans les autres navigateurs, il semble qu'il ne comprend pas la réponse – Dominic

+0

Correct - c'est pourquoi je vous avais demandé de changer votre PHP si vous obteniez une taille de réponse de 0 alors ch ances sont php ne produit rien du tout d'où ma sortie par défaut de $ sourcePage. Il se peut que les thng soient malmenés pour que '$ _POST ['source']' n'existe pas. Il se peut que FF3.5.7 rencontre des problèmes avec certains de vos balisages ou js d'une certaine façon. Essayez d'utiliser 'empty()' instea de 'isset()' et voyez s'il y a une différence. – prodigitalson

+0

Désolé, j'aurais dû être plus clair plus tôt. Quand j'ai dit qu'il ne peut pas distinguer la taille de la réponse, je veux dire qu'il donne une valeur de '?' par opposition à penser que le fichier est 0 octets. J'ai une autre déclaration qui echos 'brokenSource' dans le fichier php, donc il devrait toujours sortir quelque chose. En outre, j'ai essayé dataType: texte mais le problème persiste. – Dominic

1

Je ne sais pas si ça compte, mais je l'ai toujours passé des données sous la forme:

data: {source: 'test'} 

ont également vous vérifié ce que vous obtenez dans le texte de réponse de XMLHttpRequest? Au cas où cela vous donnerait des indices.

+0

Je ne crois pas est un problème car le php semble fonctionner correctement. Selon la documentation de jQuery, l'option de données "est convertie en une chaîne de requête, si ce n'est déjà une chaîne". Je crois que cela signifie que votre exemple sera converti en quelque chose comme ce que j'utilise e.g.'source = test ' – Dominic

+0

@Dominic: vous avez raison de passer une chaîne de requête encodée manuellement ou un objet que jQ convertira pour vous. Cela dit, j'utilise toujours la notation d'objet. – prodigitalson