DÉTECTION JAVASCRIPT/AJAX SANS RECHARGER LA PAGE (JS/PHP)

cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 - 28 mars 2007 à 11:51
 Utilisateur anonyme - 14 févr. 2008 à 19:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41990-detection-javascript-ajax-sans-recharger-la-page-js-php

Utilisateur anonyme
14 févr. 2008 à 19:20
J'ai testé et amélioré un peu le script proposé, par contre je constate une "erreur" enfin façon de parler.
Si dans la page d'origine on check la bdd pour verifier si le visiteur a le js activé ou pas on aura toujours un 0 en réponse ce qui en soit est logique puisqu'on verifie la bdd avant que le script coté client ne ce lance et donc avant qu'on passe la variable à 1.
Par ailleurs quand un visiteur X arrive sur le site avec une ip I et qu'il a le js activé on aura un enregistrement à 1 dans la bdd pour cette ip.
Demain un visiteur Y arrive sur le site avec l'adresse ip I du visiteur d'hier mais lui n'a pas le JS activé, ben notre enregistrement en bdd reste à 1.
J'ai essayé de forcer la mise à 0 dans le code de la page principale pour réinitialiser la variable à chaque chargement mais du coup on ne récupère jamais la vrai valeur si dans cette même page on check la bdd pour savoir si js est activé ou pas puisqu'elle sera toujours à la valeur du reset soit 0.
cs_Pauland Messages postés 1 Date d'inscription jeudi 28 juillet 2005 Statut Membre Dernière intervention 12 octobre 2007
12 oct. 2007 à 14:22
Je me demandais une chose moi...
Si on met une redirection par meta dans un <noscript>, il se passe quoi pour les robots?? vu qu'ils n'ont pas de JS, ils voient directement la redirection et donc passent leur chemin non ?(vu qu'il ne suivent pas la redirection)

Donc, ils font quoi ?
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
2 avril 2007 à 20:09
Dommage...
Le server a ses raison que la raison ignore :)
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
2 avril 2007 à 19:54
Non, PHP ne permet pas cela.

On peut récupérer un certain nombre d'informations (User-Agent, Referer, IP, ...) mais pas si JS est activé ou non.

Je ne suis même pas sûr que ça soit possible, puisque ce type d'information n'est probablement pas envoyée au serveur.
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
2 avril 2007 à 19:49
Et n'y a-t-il pas un objet en PHP ou on pourrait par exemple récupérer les donées du navigateur ? (comme en javascript l'objet navigator) et voir si javascript est activé ou pas ? ainsi si il est activé on dit au script PHP d'ecrire sinon non.
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
2 avril 2007 à 19:36
Tout simplement parce qu'un script PHP est executé quand il est dans une balise noscript, et ce que vous ayez ou non JS activé.

Donc quand on veut afficher du texte (HTML fixe ou dynamique avec PHP), pas de problème, mais si on veut lancer un script quand JS est activé ou pas, c'est le bazar.

La solution d'analyse des logs est sympa aussi, mais je n'y ai pas accès sur cet hébergeur de toute façon ...
MaitreJack Messages postés 10 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 2 avril 2007
2 avril 2007 à 16:48
>> >>Est-ce que le <noscript> n'a pas l'inconvénient de
>> >>provoquer une page supplémentaire dans l'historique ?
>>je ne pense pas... sauf s'il y a une redirection bien sûr.
>>et serait-ce un réel inconvénient ?
Je n'aime pas les redirections lorsqu'on peut l'éviter.
<noscript><meta http-equiv="Refresh" content="0; URL=pasdejavascript.php"></noscript>
L'inconvénient, c'est que l'internaute ne peut reculer d'une page avec le bouton «Précédent».
Mais ma principale question est : «Pourquoi Lomendil ne veut pas utiliser <noscript>?»

>> >>Cela apparaît dans mes statistiques que je fais à partir des fichiers log.
>>là d'accord, peut-être pas bête. pour des stats.
>>il n'y a pas "plus simple" ?

Oui, je te l'accorde. C'est un peu compliqué. Toutefois, j'ai déjà mon programme pour la compilation de mes fichiers logs et j'ai déjà un script dans ma page d'accueil pour obtenir la taille des écrans avec :
<script language="JavaScript">
document.write('\n');
</script>
Cela ajoute les données qui me manquaient dans mes fichiers log qui sont gérés automatiquement par le serveur Web. Bien sûr, je n'ai pas ces données si le JavaScript du client n'est pas opérationnel.
Pour moi, c'est plus simple d'ajouter quelques lignes dans mon programme de compilation des statistiques de connexion pour savoir combien n'exécute pas le JavaScript compte tenu des outils dont je dispose. Pas de SQL, juste une seule ligne javascript de la page d'accueil qui est déjà là de toute façon.

Sinon, j'aime bien la solution proposée ici.

Ma question : «Pourquoi Lomendil ne veut pas utiliser <noscript>?»
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
2 avril 2007 à 14:40
>>Est-ce que le <noscript> n'a pas l'inconvénient de
>>provoquer une page supplémentaire dans l'historique ?
je ne pense pas... sauf s'il y a une redirection bien sûr.
et serait-ce un réel inconvénient ?

>>Qu'arrive-t-il lorsque l'internaute tente de reculer d'une page ?
la même chose qu'avec javascript installé à priori.
tu as testé ?

>>Cela apparaît dans mes statistiques que je fais à partir des fichiers log.
là d'accord, peut-être pas bête. pour des stats.
il n'y a pas "plus simple" ?
@+
MaitreJack Messages postés 10 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 2 avril 2007
2 avril 2007 à 14:26
Je trouve l'exemple intéressant. Est-ce que le <noscript> n'a pas l'inconvénient de provoquer une page supplémentaire dans l'historique ? Qu'arrive-t-il lorsque l'internaute tente de reculer d'une page ?

Toutefois, pour avoir des statistiques sur la désactivation du JavaScript, je m'y prend autrement. J'ai placé un script qui crée une image invisible par DOM. Une entrée de cette image apparait dans le fichier log du serveur si le client a JavaScript actif. Cela apparaît dans mes statistiques que je fais à partir des fichiers log.
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
1 avril 2007 à 13:04
L'idée est bonne, mais je ne vois pas l'intérêt de changer alors que noscript marche très bien.
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
28 mars 2007 à 16:29
je viens de comprendre le sens de la phrase...
les balises <noscript> c'est du html.
c'est donc php qui peut les génèrer
ainsi que le contenu , pas l'inverse.
@+
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
28 mars 2007 à 16:26
>>difficile - voire impossible ? - à combiner à des scripts PHP
pas compris cette affirmation ?

...
page d'accueil
<noscript>
<meta http-equiv="Refresh"
content="0; URL=pasdejavascript.php">
</noscript>
...
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 16:11
Mes contraintes à la construction de ce script étaient les suivantes :

- Pas d'utilisation de <noscript> (difficile - voire impossible ? - à combiner à des scripts PHP).
- Pas d'intervention de la part de l'utilisateur.
- Pas de rechargement de page.
- Mise à jour d'une table de statistiques afin de connaitre la proportion de personnes pouvant voir le site dans de bonnes conditions.

A partir de là, je suis entièrement d'accord sur le fait que ce code est améliorable, surtout au niveau des cas particuliers (les proxies posent effectivement un problème, je n'y avais d'ailleurs pas pensé).

Malgré tout cela, n'hésitez pas à reprendre tout ou une partie du code pour publier une nouvelle source plus propre et correspondant à d'autres contraintes, nous sommes là pour ça.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
28 mars 2007 à 15:03
Tout comme Bultez... noscript est amplement suffisant... là tu fais des requetes SQL pour pas grand chose... qui plus est ta technique pour récupérer l'ip n'est pas fiable... tu fais comment si un internaute est derrière un proxy avec le js de désactivé un autre internaute derrière le même proxy à un navigateur ne supportant pas les xmlhttprequest et un dernier toujours derrière le même proxy à un navigateur avec javascript d'activé supportant les xhr... .. ?

C'est au niveau de tes fonctions javascript que tu dois gérer ça... .. .

par exemple

au chargement de la page tu fais ta requete ajax pour mettre à jour une variable genre...

var ajaxIsOk = false;

function VerifAjax()
{
var xhrObj = null;

if(window.XMLHttpRequest) // Firefox
xhrObj = new XMLHttpRequest();
else if(window.ActiveXObject)// Internet Explorer
{
try {
xhrObj = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xhrObj = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e1) { xhrObj = null; }
}
}

if(xhrObj)
ajaxIsOk = true;
}

Ensuite imaginons un lien déclenchant une fonction javascript utilisant ajax...


Mon Action


la fonction

function monAction(url)
{
if(!ajaxIsOk) // ajax non supporté on renvoi true navigateur suivra le lien
return true;

// traitement de la requete ajax

return false;// on renvoi false le navigateur ne suit pas le lien
}

Voila... c'est bien plus propre, optimisé et portable... .. .

@ tchaOo°
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
28 mars 2007 à 13:52
>>Je dois mal m'exprimer
mes remarques ne concernaient pas du tout le script.
pour qui me prendrais-je pour juger ?
néanmoins :
>>avec l'IP du visiteur
le commun des mortels n'a jamais qu'une IP variable
>>php..mysql...
certes... mais sur mon site, mon fai n'autorise ni l'un ni l'autre,
comme utilisateur, je désactive le javascript...
franchement : <noscript> c'est quand même plus simple, standard...

c'est plus que dommage : avec un titre et un but étaient différents,
des choses sont à [ap]prendre dans ce script.
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 12:38
Je dois mal m'exprimer :D

Chaque visite de la page entraine un INSERT avec l'IP du visiteur (ou UPDATE s'il existe déjà), bien sûr.
Grâce à la structure de la table (`AJAX` tinyint(1) NOT NULL default '0'), toute insertion contient 0 dans la colonne AJAX.

Si JS est désactivé, le script PHP (verif_ajax.php) n'est pas appelé et la ligne n'est pas mise à jour dans la table MySQL. Si JS et XMLHttpRequest sont disponibles, alors la ligne est mise à jour et AJAX vaut 1.
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
28 mars 2007 à 12:32
>>et tu la testes où cette valeur ?
>>dans un php qui serait appelé avec du javascript ?
>Oui
d'où ma question initiale : et si le javascript est désactivé, il se passe quoi ?
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 12:16
Oui.

XMLHttpRequest appelle verif_ajax.php et met la BDD à jour. On a donc l'assurance que l'utilisation d'AJAX est possible sur le navigateur de l'utilisateur et, par déduction, JavaScript.

C'est vrai que c'est un peu en vrac comme présentation (tout à la suite ...), je ferais mieux la prochaine fois !



PS: J'ai noté un oubli de ma part, VerifAjax() doit être VerifAjax('<?=get_ip()?>'), sinon le script ne sait pas quelle ligne il doit mettre à jour !

Hop, je modifie.
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
28 mars 2007 à 12:04
et tu la testes où cette valeur ?
dans un php qui serait appelé avec du javascript ?
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 11:56
Justement, il ne se passe rien. La valeur reste donc à celle par défaut -> 0
Si JS est activé, alors il se passe quelque chose (logique :D) et la valeur passe à 1.

La contrainte est qu'il faut enregistrer chaque IP dans une table, mais quand on utilise déjà un script de statistiques, ça ne pose pas de problème.
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
28 mars 2007 à 11:51
>>un moyen de détecter si JavaScript est activé...
>>Ce script utilise JavaScript
c'est assez rigolo...
si le javascript est désactivé, il se passe quoi ?
Rejoignez-nous