2010-05-15 4 views
3

Cette question a peut-être déjà été posée - mais malheureusement, je n'ai trouvé aucune réponse satisfaisante. Je vais juste demander pour mon cas concret et demander aux administrateurs de ne pas supprimer la question pendant au moins quelques jours afin que je puisse l'essayer ...Utilisez AJAX pour recharger le captcha

J'ai une page. Il utilise un captcha. Comme si:

<?php 
session_start(); // the captcha saves the md5 into the session 
?> 
<img src="captcha.php" onclick="this.src = this.src" /> 

C'était mon premier code. Cela n'a pas fonctionné, car le navigateur a jugé inutile de recharger une image si la source est la même. Ma solution actuelle est de passer un parametre:

onclick="this.src = 'captcha.php?randomNumber='+ranNum" 

La variable JavaScript var ranNum est généré au hasard chaque fois que l'événement se déclenche onclick. Cela fonctionne bien, encore, je n'aime pas la possibilité, si le cas - bien qu'improbable - de deux nombres soit le même deux fois de suite. Bien que le nombre aléatoire varie entre -50 000 et 50 000, je ne l'aime toujours pas. Et je ne pense pas que la méthode soit correcte. Je voudrais connaître la méthode «righter», au moyen d'AJAX. Je sais que c'est possible. J'espère que tu sais comment c'est possible ^^ Dans ce cas, montre-moi s'il te plaît.

Merci d'avance!

Soit dit en passant - si j'épelle cap (t) cha autrement, jamais l'esprit, la référence au fichier PHP est juste dans mon code: J'utilise randomImage.php

EDIT: Le nombre aléatoire en JavaScript est généré uniquement pour que l'image se recharge. Captcha.php ne se soucie pas du paramètre $ _GET. La chaîne est vraiment aléatoire.

EDIT: Ainsi, ce que je voudrais savoir, c'est comment rendre le navigateur relaod l'image sans passer différents paramètres de get chaque fois que l'événement se déclenche.

+0

Vous pouvez essayer recaptcha –

+0

Ouais, je pense que rien ne l'emporte sur la lecture de livres;) – arik

Répondre

5

Malheureusement, AJAX ne fournit pas un bon moyen de charger dynamiquement des images. Même en utilisant l'astuce "préchargement" javascript, le navigateur charge chaque image une fois par URL. Le seul moyen pour que le navigateur charge une autre image de la même source consiste à utiliser un paramètre différent, comme vous le faites actuellement. Et, comme d'autres réponses l'ont indiqué, l'horodatage devrait suffire à cela.

+0

Eh bien ... c'est assez malheureux. Merci. – arik

+0

Il semble que ce soit en dehors de la portée de la langue (PHP) et dans le cadre du serveur web. Je ne l'ai pas essayé, mais je pense que si vous utilisez Apache, vous pouvez utiliser un module comme [réécrire] (https://httpd.apache.org/docs/2.4/rewrite/remapping.html) pour mapper toute requête à , disons,/captcha * dans votre php, supprimant ainsi le besoin d'un paramètre get. C'est aussi si vous administrez le serveur web et c'est apache. Il pourrait y avoir d'autres façons avec d'autres serveurs. – dabicho

3

Avez-vous envisagé d'utiliser un horodatage à la place?

onclick="this.src='captcha.php?ts='+Math.round(new Date().getTime()/1000)" 
+0

qui semble intéressant. il n'y aurait pas de risque d'un nombre répétitif.encore, je voudrais savoir comment cela est fait avec AJAX ^^ – arik

+0

C'est asynchrone et fait usage de JS, donc c'est AJAX. – nico

+1

@Nico: il n'y a pas de XML et il n'utilise pas XMLHttpRequest, donc ce n'est pas techniquement AJAX. Le navigateur charge juste l'image pour vous quand il détecte la nouvelle source. –

1

utiliser Just:

<img src="captcha.php" onclick='this.src = "captcha.php&time=" + new Date().getTime();' />

Vous pouvez jeter le paramètre de temps et de générer le nombre aléatoire en PHP. :)

+0

merci. Je suis désolé, la question n'était pas claire, je ne tiens pas compte du paramètre get. C'est seulement utilisé pour forcer le navigateur à relâcher l'image;) Pourtant, je voudrais savoir comment je peux forcer le navigateur à réaligner l'image SANS passer un paramètre get aléatoire. – arik

+1

@ arik-so Pour autant que je sache, il n'y a aucun moyen de le faire. Si le navigateur voit que le src de l'image est le même, il ne le rechargera pas. J'ai récemment examiné un problème similaire et c'est à peu près la seule solution que j'ai trouvée. Bien sûr, si quelqu'un connaît une autre option, je serais très heureux de le savoir! – nico

+1

bien, je vais attendre et laisser la question ouverte. Peut-être que quelqu'un trouvera une réponse. – arik

0

Vous pouvez également obtenir l'image à partir d'une requête Ajax encodée en base64 et la mettre dans la balise img aussi.

Bien sûr, je pense que c'est exagéré et un fichier encodé en base64 est environ 4/3 de la taille de l'original. (Une image de 3 Ko serait d'environ 4 Ko sur base64).

Edit: pour avoir l'attribut img src comme

données: image/png; base64, base64encodedimage

Questions connexes