ZuckBin Posté 9 Avril 2009 Posté 9 Avril 2009 (modifié) Bonjour, Voici ma fonction de compteur Ajax sur un lien avec un événement onclick /* Création de la variable globale qui contiendra l'objet XHR */function createXhrObject(){ if (window.XMLHttpRequest) return new XMLHttpRequest(); if (window.ActiveXObject) { var names = [ "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP" ]; for(var i in names) { try{ return new ActiveXObject(names[i]); } catch(e){} } } window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest."); return null; // non supporté}xhr = createXhrObject();function compteur(idr){ /* On crée l'objet XHR */ createXhrObject(); /* Définition du fichier de traitement */ var url = '/compteur.php?id='+ idr; /* Envoi de la requête à la page de traitement */ xhr.open('GET', url, true); xhr.send(null);} Le soucis c'est que ça fonctionne pas sur Safari pc 3.2.2, chrome 1.0.154.53, mais aucune erreurs. Aucun soucis sur Firefox, IE, Opera. Une idée d'où peu venir le problème ? Merci de votre aide Modifié 9 Avril 2009 par ZuckBin
SStephane Posté 9 Avril 2009 Posté 9 Avril 2009 J'utilise un framework pour faire de l'ajax habituellement, mais le sujet m'intéresse, j'ai pas trop le temps de regarder, mais voila une piste : Un bon truc pour parcourir les attributs en JS : <script type="text/javascript">for(var a in window){ document.write(a+" => "+window[a]+"<br>");}</script> Je constate que XMLHttpRequest est utilisé avec chrome, du coup je trace : document.write(window.XMLHttpRequest == null); J'obtiens false, qu'obtiens tu sur ta page avec cette ligne ? (tu passes dans ta méthode compteur() ?)
ZuckBin Posté 9 Avril 2009 Auteur Posté 9 Avril 2009 J'obtiens aussi false avec cette commande document.write(window.XMLHttpRequest == null); Et j'ai pas compris le premier code, je l'ai installe, mais cela ne m'a pas aidé. ++
SStephane Posté 9 Avril 2009 Posté 9 Avril 2009 (modifié) J'ai peut-être, sur prototype il surcharge le type mime, essaie comme ça apres la création de ton objet : xhr = createXhrObject();if (xhr.overrideMimeType){ xhr.overrideMimeType("text/xml");} ça fonctionne ? Modifié 9 Avril 2009 par SStephane
ZuckBin Posté 9 Avril 2009 Auteur Posté 9 Avril 2009 Non ça fonctionne pas mieux. j'avais déjà vu cette piste
SStephane Posté 9 Avril 2009 Posté 9 Avril 2009 Je retente 2 trucs D'une part : xhr.overrideMimeType('text/xml; charset=UTF-8'); D"autre part : xhr.open('GET', url, false); le boolean défini si l'opération est asynchrone ou non; vérifie avec ça.
ZuckBin Posté 9 Avril 2009 Auteur Posté 9 Avril 2009 (modifié) Trop bien, ça fonctionne.... Pour rappel, voila le code complet: /* Création de la variable globale qui contiendra l'objet XHR */function createXhrObject(){ if (window.XMLHttpRequest) return new XMLHttpRequest(); if (window.ActiveXObject) { var names = [ "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP" ]; for(var i in names) { try{ return new ActiveXObject(names[i]); } catch(e){} } } window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest."); return null; // non supporté}xhr = createXhrObject();if (xhr.overrideMimeType){ xhr.overrideMimeType('text/xml; charset=UTF-8');}function compteur(idr){ /* On crée l'objet XHR */ createXhrObject(); /* Définition du fichier de traitement */ var url = '/compteur.php?id='+ idr; /* Envoi de la requête à la page de traitement */ xhr.open('GET', url, false); xhr.send(null);} Merci Beaucoup Stéphane Modifié 9 Avril 2009 par ZuckBin
SStephane Posté 9 Avril 2009 Posté 9 Avril 2009 cool Vu que c'est synchrone avec le false (d'après http://msdn.microsoft.com/en-us/library/ms536648(VS.85).aspx en tout cas), vérifie ce qu'il se passe quand ça plante quand même : genre en virant ton fichier PHP, il faut peut être que tu mettes un timeout au cas ou ça ne réponde pas. et merci à toi d'avoir lancé le sujet !
ZuckBin Posté 9 Avril 2009 Auteur Posté 9 Avril 2009 Je veux allez plus loin, mais par manque de temps, je dois m'occuper d'autre chose pour le moment. Je vous met ma fonction de compteur php. L'idée est de protéger le compteur contre les clics multiples, par exemple en stockant Ip dans la base, et autoriser un seul clic par lien pendant 24h. Fichier compteur.php appelé par le code xhr précédent. <?phpecho"<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>";require_once('connections/ghv.php');mysql_select_db($database_ghv, $ghv);if($_SERVER) { if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $adress = $_SERVER['HTTP_X_FORWARDED_FOR']; elseif(isset($_SERVER['HTTP_CLIENT_IP'])) $adress = $_SERVER['HTTP_CLIENT_IP']; else $adress = $_SERVER['REMOTE_ADDR']; } else { if(getenv('HTTP_X_FORWARDED_FOR')) $adress = getenv('HTTP_X_FORWARDED_FOR'); elseif(getenv('HTTP_CLIENT_IP')) $adress = getenv('HTTP_CLIENT_IP'); else $adress = getenv('REMOTE_ADDR'); }$id_link=$_GET['id'];$query="UPDATE table_id_links SET nb_clicks=nb_clicks+1 WHERE id_link='".$id_link."' ";$compt = mysql_query($query, $ghv) or die(mysql_error());?> Si quelqu'un se lance, ça pourra servir à d'autres ++
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant