2010-06-02 7 views
4

Veuillez noter: les réponses suivant les termes 'use jquery' ou 'use (insert wellknown framework)' ne sont pas utiles. Des cadres tels que jquery comprend beaucoup de code supplémentaire qui n'est pas du tout nécessaire pour ce que je fais. "Mais, vous pouvez en inclure un de Google", oui c'est peut-être le cas, mais je préfère garder mon propre code. Dans cet esprit, passons au problème ....AJAX ne passant pas les variables POST dans IE7/IE8

J'ai un appel ajax qui ne passe pas les tests POST via IE7/IE8, mais seulement dans des occasions spéciales. Il semble être extrêmement aléatoire et la plupart du temps cela fonctionne.

Je me suis jeté un oeil à jquery et ne voit pas beaucoup de différence dans la façon dont cela fonctionne par rapport à celui personnalisé.

est ici la fonction ajax:

function GetXmlHttpObject(handler){ 
    var objxml = null; 
if(handler==null) { 
    handler = function() {} 
} 

    var ProgID = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];    

    try { 
     objxml = new XMLHttpRequest(); 
    } 
    catch(e) { 
     for (var i = 0; i < ProgID.length; i++){ 
      try { 
       objxml = new ActiveXObject(ProgID[i]); 
      } 
      catch(e) { 
       continue; 
      } 
     } 
    } 
objxml.onreadystatechange=handler; 

    return objxml; 
} 

Une fonction qui appelle la fonction Ajax serait comme ceci:

function sample_ajax(object_type,object_id) { 
var d = new Date(); 
var time = d.getTime(); 
var url= MYSITEURL + "my_ajax_script.php?timestamp="+time; 

params = "object_type="+object_type+"&object_id="+object_id; 
xmlHttp_comment_notifyreset = GetXmlHttpObject(sample_ajax_helper);//fails on safari 1 
xmlHttp_comment_notifyreset.open("POST", url , true); 

xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "no-cache"); 
xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "no-store"); 
xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "must-revalidate"); 
xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "post-check=0"); 
xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "pre-check=0"); 
xmlHttp_comment_notifyreset.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); 


xmlHttp_comment_notifyreset.setRequestHeader("Content-Type", "application/x-www-form-URLencoded"); 
xmlHttp_comment_notifyreset.setRequestHeader("Content-Length", params.length); 
xmlHttp_comment_notifyreset.setRequestHeader("Connection", "close"); 

xmlHttp_comment_notifyreset.send(params); 
} 

Je suis allé voir jquery et ne peut pas voir beaucoup de différence dans la Cela fonctionne de façon comparable à celle personnalisée.

+0

Personne n'a des suggestions? – David

+0

Pourriez-vous s'il vous plaît donner un exemple de code de votre fonction de gestionnaire. –

+0

Si "If-Modified-Since" est un en-tête valide pour POST?, Vous devriez peut-être le supprimer. – naikus

Répondre

2

Si les params ne sont A défaut d'être envoyé parfois, le problème peut être dans cette ligne:

params = "object_type="+object_type+"&object_id="+object_id; 

Le les params ne sont pas échappés. Essayez ceci:

params = "object_type=" + 
     encodeURIComponent(object_type) + 
     "&object_id=" + 
     encodeURIComponent(object_id); 
0

Utilisez The Ultimate Ajax Object. C'est concis, explicite et cela fonctionne sur tous les navigateurs.

+1

Jetez un coup d'oeil à ceci, et il n'y a pas vraiment quelque chose de différent dans la façon d'envoyer la requête de la façon dont je le fais maintenant. La seule différence est qu'ils l'ont mis dans une classe. – David

0

Je ne me souviens pas d'avoir déjà vu un type de contenu avec des majuscules comme "application/x-www-form-URLencoded", et je ne sais pas si ça serait dans les spécifications. I ont vu, cependant, PHP ignore un POST en raison d'un en-tête Content-Type absent dans la demande. (en raison d'un proxy qui a décidé de l'omettre)

PHP ignore tout type de contenu qu'il ne reconnaît pas. Les chances sont minces que cela va résoudre n'importe quoi, mais vous pourriez essayer de changer URL à url.

+0

pour clarifier: Je ne dis pas que vous utilisez PHP et que le problème réside là, c'est juste qu'il y a plusieurs parties de la chaîne de bout en bout qui peuvent faire quelques vérifications (par exemple des proxies) et causer des problèmes. – mvds

Questions connexes