Aller au contenu

Ajax qui passe pas bien sur


ZuckBin

Sujets conseillés

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é par ZuckBin
Lien vers le commentaire
Partager sur d’autres sites

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() ?)

Lien vers le commentaire
Partager sur d’autres sites

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é.

++

Lien vers le commentaire
Partager sur d’autres sites

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é par SStephane
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Posté (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é par ZuckBin
Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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.

<?php

echo"<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 ;)

++

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...