+ -
当前位置:首页 → 问答吧 → 发一个兼容多种浏览器的验证码

发一个兼容多种浏览器的验证码

时间:2008-09-23

来源:互联网

由于近日来开发博客,在做的过程中,也发现了一些不可忽视的问题。在做后台登录的时候,有一项是验证码功能,原本轻易地实现了,但后来才发现,在不同浏览器上不能兼容点击刷新功能。比如像:
[php]
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" width="65" height="20" border="0" id="verify_code" onclick="document.getElementById('verify_code').src='verify_image.php?'+Math.random();" style="cursor:pointer;" />
[/php]
不能在IE7和火狐上实现“点此刷新功能”

起初我也是使用这种方法,但不能兼容。于是便想到了另一个方法,并且成功了!非常的惊喜!现在与大家分享一下成果。
首先是验证码页:code.php
[php]
<?php
session_start();
Header("Content-type: image/GIF");
$_SESSION['authnum']="";
$im = imagecreate(50,20) or die("Cant's initialize new GD image stream!");  //制定图片背景大小
$black = ImageColorAllocate($im, 0,0,0); //设定三种颜色
$green = ImageColorAllocate($im, 224,199,77);
$gray = ImageColorAllocate($im, 45,85,90);
//imagefill($im,0,0,$gray); //采用区域填充法,设定(0,0)
imagefill($im,0,0,$green);//ed
$ychar="0,1,2,3,4,5,6,7,8,9";
$list=explode(",",$ychar);
for($i=0;$i<4;$i++){
  $randnum=rand(0,9);
  $authnum.=$list[$randnum];//
}
$_SESSION['authnum']=$authnum;
//int imagestring(resource image,int font,int x,int y,string s, int col)
imagestring($im, 5, 10, 3, $authnum, $black);
//用col颜色将字符串s画到image所代表的图像的x,y坐标处(图像的左上角为0,0)。
//如果 font 是 1,2,3,4 或 5,则使用内置字体
for($i=0;$i<200;$i++){ //加入干扰象素 {
$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($im, rand()%90 , rand()%30 , $randcolor);
imagesetpixel($im, rand()%90 , rand()%30 , $gray);
}
//echo $im;
ImageGIF($im);
ImageDestroy($im);
//die();
?>
[/php]
此种页面取两个重命名。

实现页:login.php
  [php]
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>后台管理</title>
<link href="style/admin.css" rel="stylesheet" type="text/css" />
<script language="JavaScript">
<!--
var validate = true;
function get_code(){
if(validate==true){
document.getElementById("findcode").src="code2.php";
//alert(validate);
validate = false;
return false;
}else{
document.getElementById("findcode").src="code.php";
//alert(validate);
validate = true;
return false;
}
}
-->
</script>
</head>
<body>
<img src="code.php" name="findcode" width="43" height="17" border="0" id="findcode" style="cursor : pointer;"/> <span style="color:green;"><a href="javascript://">看不清,换一个</a></span>
</body>
</html>
[/php]
   现在贴上演示地址供大家参考,指正:http://www.fla8d.cn/pblog/?id=16&style=&typeid=1011

validate.rar (2.15 KB)

下载次数:135

2008-9-23 10:59

作者: pangjincai   发布时间: 2008-09-23

晕死,其实就是IE7

如果我验证码文件为imgcode.php
如下调用显示验证码。
<img src="imgcode.php" />

然后用当点击的时候修改img的src属性时候,只要
'imgcode.php?&amp;ran=‘+Math.random()
后面加个随机数就行了。如果不加随机数,那么IE7下面无法点击,IE6,firefox没事。

加了之后就能点击了。我前几天刚试过。

作者: 阿辛   发布时间: 2008-09-23

第1种ff3可以啊.ie7没有试过.

作者: myBe   发布时间: 2008-09-23

看来是lz偷懒,调用时省了一个参数,结果却在服务器端大费动作.

作者: myBe   发布时间: 2008-09-23

不过,lz个验证码的的体积比较小巧,借来用用.

作者: myBe   发布时间: 2008-09-23

不错,支持

作者: e_zailai   发布时间: 2008-11-10

IE6下显示不出来???

作者: 0hudu   发布时间: 2008-11-10

不加随机参数时,浏览器误认为图片没有变,就不会刷新,刷新时也可能会从缓存中读取出来,
上次做那个JS切图片的效果,也是用到了随机参数才解决的

作者: fly1983   发布时间: 2008-11-11

刚才测试了一下
ie6、ff、op、chrome都不能正常显示

作者: jason123j   发布时间: 2008-12-11

支持一下,,,,,,,,,,,,,,,,,,

作者: fly1983   发布时间: 2008-12-11

多谢!顶起!

作者: 春的世界   发布时间: 2008-12-14

貌似代碼有錯。。。。

作者: sejie10011   发布时间: 2008-12-14


不用这样吧,只要调用时加个随机数就行了。

<img src=".php" onClick="this.src=.php?id='+Math.random();" style="cursor:pointer;" />

作者: maohuixia   发布时间: 2008-12-15

好东西,学习下啊

作者: syw0602   发布时间: 2009-01-06