【 tulaoshi.com - Web开发 】
                             
                            *项目名称:具有良好体验度的Web注册系统 
*作者:草履虫 
*联系:caolvchong@gmail.com 
*时间:2007-6-29 
*起因和版权说明: 
  1.蓝色理想上有位会员发布了个类似的系统,提问说验证码不支持firefox的刷新,于是萌生念头做一个.本系统外观(按钮取色等)借鉴了该系统,但细节实现原理并不相同(该文地址:http://bbs.blueidea.com/thread-2761325-1-4.html). 
  2.另外,自己做的这个注册系统中利用了网络上的无组件验证码(作者sipo) 
  3.至于密码强度的算法借鉴了蓝色理想的一篇文章(http://www.blueidea.com/tech/web/2006/4324.asp),但该算法并不十分理想,如果有更好算法的朋友不妨交流一下 
*特点和知识点: 
  1.AJAX验证用户名和验证码,同时异步进行用户名注册(都属于AJAX的很基础部分) 
  2.支持验证码刷新(包括firefox平台下) 
  3.密码,邮箱,用户名等即时检测(利用javascript DOM) 
  4.HTML通过W3C Strict验证,CSS也通过W3C CSS验证(其实这个有点多余,并不完全必要) 
*开发平台:Windows2003 IIS6.0 Access数据库 
*工具:DreamWeaver(写ASP),Aptana(写Javascript,HTML和CSS),Emeditor(写这篇文章),Access2003(数据库) 
*测试平台:Firefox2.0,Opera9.21,IE6.0,IE7.0 
*演示地址:http://finish.3322.org/reg/reg.htm(短期有效,在本机上,可能访问不顺畅) 
*原文地址:http://cceer.xmu.edu.cn/blog/view.asp?id=52 
*补充: 
  如果你使用这个注册系统,请务必注意下列问题: 
    本系统没有对密码进行加密,如果需要,可以搜索MD5加密 
    本系统没有进行防注入设置,如果需要,可以搜索SQL防注入 
  限于本人水平上的限制,错误和不足在所难免,如果你有问题或者建议,请联系我,感谢! 
*这里是效果图 
限于文章长度的限制,只帖出两个js文件和一个显示注册页面,至于后台处理页面以及css文件等,请在压缩包中查看 
1.reg.htm(由于BLOG会过滤,分开三个部分写)  
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312"  
head 
meta http-equiv="Content-Type" content="text/html; charset=GB2312" / 
title草履虫---简易AJAX注册页面/title 
  link href="reg.css" type="text/css" rel="stylesheet" / 
  script src="detect.js" type="text/javascript"/script 
  script src="ajax.js" type="text/javascript"/script 
/head 
body onload="check_data();" 
view plaincopy to clipboardprint? 
UL   
LI id=title草履虫---Web注册系统    
LI class=underline   
    LABEL注册用户名:    
        INPUT onblur=check_id(this.value); maxLength=16   
    /LABEL   
    SPAN支持汉字,单词,数字,敏感字符屏蔽/SPAN   
LI   
    LABEL注册密码:    
        INPUT onblur=check_password(); type=password value=""   
    /LABEL   
    SPAN密码在6-16位之间,敏感字符屏蔽/SPAN   
LI class=underline   
    LABEL重复密码:    
        INPUT onblur=check_pw(); type=password maxLength=16 value=""   
    /LABEL   
    SPAN/SPAN   
LI class=underline   
    LABEL邮箱:    
        INPUT onblur=check_email(this.value)   
    /LABEL   
    SPANemail是联系重要手段/SPAN   
LI class=underline验证码:    
    INPUT onblur=checkcode(this.value); maxLength=5   
    LABEL   
        IMG id=src onclick="this.src=this.src+'?'+Math.random();" height=18 alt=看不清楚?请点击刷新 src="getcode.asp"   
        SPAN看不清楚?请点击验证码刷新/SPAN   
    /LABEL   
LI class=underline   
    相关协议:    
        LABEL onclick=accept_info();INPUT type=radio name=info接受/LABEL   
        LABEL onclick=refuse_info();INPUT type=radio name=info不接受/LABEL     
        INPUT class=button type=button value=阅读协议   
LI class=underline   
    INPUT class="button setleft" onclick="sendinfo($('input')[0].value,$('input')[1].value,$('input')[3].value)" type=submit value=注册   
    INPUT class=button onclick=reset_info() type=reset value=重置   
    SPAN/SPAN   
LI class=copyright作者:草履虫    
LI class=copyright时间:2007-6-28    
LI class=copyright联系:caolvchong@gmail.com    
LI class=copyrightBlog---Web2.0之路:A href="http://cceer.xmu.edu.cn/blog/"http://cceer.xmu.edu.cn/blog//A   
/LI/UL         
        草履虫---Web注册系统 
            注册用户名:              
            支持汉字,单词,数字,敏感字符屏蔽          
            注册密码:              
            密码在6-16位之间,敏感字符屏蔽          
            重复密码:                       
            邮箱:              
            email是联系重要手段 
        验证码:              
                看不清楚?请点击验证码刷新          
            相关协议: 
                接受 
                不接受                                     
        作者:草履虫 
        时间:2007-6-28 
        联系:caolvchong@gmail.com 
        Blog---Web2.0之路:http://cceer.xmu.edu.cn/blog/ 
/body 
/html 
2.detect.js view plaincopy to clipboardprint? 
    var flag=[0,0,0,0,0,0];    
    var $=function(tagName){    
        return document.getElementsByTagName(tagName);    
    }    
//----------接受协议    
    function accept_info(){    
        flag[0]=1;    
        check_data();    
    }    
//----------拒绝协议    
    function refuse_info(){    
        flag[0]=0;    
        check_data();    
    }    
//----------重置    
    function reset_info(){    
        var info=["支持汉字,单词,数字,敏感字符屏蔽","密码在6-16位之间,敏感字符屏蔽","","email是联系重要手段","看不清楚?请点击验证码刷新"]    
        for(var i=0;i$("span").length;i++){    
            $("span")[i].innerHTML=info[i];    
            flag[i]=0;    
        }    
        for(var i=0;i$("input").length-3;i++){    
            $("input")[i].value="";    
        }    
        check_data();    
    }    
//----------邮箱检测    
    function check_email(email){    
        var reEmail=/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/;    
        var b_email=reEmail.test(email);    
        if(b_email){    
            $("span")[3].innerHTML="IMG src="yesok.gif" 邮箱可用";    
            flag[1]=1;    
            check_data();    
        }    
        else{    
            $("span")[3].innerHTML="IMG src="yesno.gif" 邮箱错误";    
            flag[1]=0;    
            check_data();    
        }    
    }    
//----------密码检测    
    function check_password(obj){    
        var pwd=$("input")[1].value;    
        var reChinese=/[u0391-uFFE5]+/;    
        var b_chinese=reChinese.test(pwd);    
        var reSpace=/s+/;    
        var b_space=reSpace.test(pwd);    
        //-------长度测试    
        if(pwd.length6){    
            $("span")[1].innerHTML="IMG src="yesno.gif" 密码长度不能小于6";    
            flag[2]=0;    
            check_data();    
        }    
        //-------合法性检测:不能包含汉字    
        else if(b_chinese){    
            $("span")[1].innerHTML="IMG src="yesno.gif" 密码不能包含中文";    
            flag[2]=0;    
            check_data();    
        }    
        //-------合法性检测:不能包含空格    
        else if(b_space){    
            $("span")[1].innerHTML="IMG src="yesno.gif" 密码不能包含空格";    
            flag[2]=0;    
            check_data();    
        }    
        //-------合法时显示密码强度    
        else{    
            //定义对应的消息提示    
            var num=getResult(pwd);    
            var msg=new Array("IMG src="bad.gif" 密码强度差","IMG src="comm.gif" 密码强度一般","IMG src="good.gif" 密码强度强壮");    
            $("span")[1].innerHTML=msg[num];    
            if($("input")[2].value!=""){    
                check_pw();    
                }    
            return flag[2]=1;    
            check_data();    
            }    
        }    
        //定义检测函数,返回0/1/2分别代表差/一般/强    
        function getResult(s){    
            var ls =-1;    
            if (s.match(/[a-z]/ig)){    
                ls++;    
            }    
            if (s.match(/[0-9]/ig)){    
                ls++;    
            }    
            if (s.match(/(.[^a-z0-9])/ig)){    
                ls++;    
            }    
            return ls;    
        }    
    //---------密码一致性检测      
        function check_pw(){    
            var pwd=$("input")[1].value.toString();    
            var check_pwd=$("input")[2].value.toString();    
            if(flag[2]==1){    
                if(pwd==check_pwd){    
                    $("span")[2].innerHTML="IMG src="yesok.gif" 密码可以使用";    
                    flag[3]=1;    
                    check_data();    
                }    
                else{    
                    $("span")[2].innerHTML="IMG src="yesno.gif" 两次密码不相同";    
                    flag[3]=0;    
                    check_data();    
                }    
            }    
        }    
    //---------用户名合法性检测    
        function check_id(id_name){//只能字母和数字,是否相同用AJAX判断    
            var reId=/^[wu0391-uFFE5]+$/;    
            var b_id=reId.test(id_name);    
            if(!b_id){    
                $("span")[0].innerHTML="IMG src="yesno.gif" ID命名非法";    
                flag[4]=0;    
                check_data();    
            }    
            else{//合法用户名用ajax的checkid()检测是否被注册过    
                checkid(id_name);    
            }    
        }    
    //---------检查数据,使提交按钮是否生效    
        function check_data(){    
            if(flag[0]==1 && flag[1]==1 && flag[2]==1 && flag[3]==1 && flag[4]==1 && flag[5]==1){    
                $("input")[8].disabled=false;    
            }    
            else{    
                $("input")[8].disabled=true;    
            }    
        }    
//--------------------------------------------------------------------   
        var flag=[0,0,0,0,0,0]; 
        var $=function(tagName){ 
            return document.getElementsByTagName(tagName); 
        } 
    //----------接受协议 
        function accept_info(){ 
            flag[0]=1; 
            check_data(); 
        } 
    //----------拒绝协议 
        function refuse_info(){ 
            flag[0]=0; 
            check_data(); 
        } 
    //----------重置 
        function reset_info(){ 
            var info=["支持汉字,单词,数字,敏感字符屏蔽","密码在6-16位之间,敏感字符屏蔽","","email是联系重要手段","看不清楚?请点击验证码刷新"] 
            for(var i=0;i$("span").length;i++){ 
                $("span")[i].innerHTML=info[i]; 
                flag[i]=0; 
            } 
            for(var i=0;i$("input").length-3;i++){ 
                $("input")[i].value=""; 
            } 
            check_data(); 
        } 
    //----------邮箱检测 
        function check_email(email){ 
            var reEmail=/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/; 
            var b_email=reEmail.test(email); 
            if(b_email){ 
                $("span")[3].innerHTML=" 邮箱可用"; 
                flag[1]=1; 
                check_data(); 
            } 
            else{ 
                $("span")[3].innerHTML=" 邮箱错误"; 
                flag[1]=0; 
                check_data(); 
            } 
        } 
    //----------密码检测 
        function check_password(obj){ 
            var pwd=$("input")[1].value; 
            var reChinese=/[u0391-uFFE5]+/; 
            var b_chinese=reChinese.test(pwd); 
            var reSpace=/s+/; 
            var b_space=reSpace.test(pwd); 
            //-------长度测试 
            if(pwd.length6){ 
                $("span")[1].innerHTML=" 密码长度不能小于6"; 
                flag[2]=0; 
                check_data(); 
            } 
            //-------合法性检测:不能包含汉字 
            else if(b_chinese){ 
                $("span")[1].innerHTML=" 密码不能包含中文"; 
                flag[2]=0; 
                check_data(); 
            } 
            //-------合法性检测:不能包含空格 
            else if(b_space){ 
                $("span")[1].innerHTML=" 密码不能包含空格"; 
                flag[2]=0; 
                check_data(); 
            } 
            //-------合法时显示密码强度 
            else{ 
                //定义对应的消息提示 
                var num=getResult(pwd); 
                var msg=new Array(" 密码强度差"," 密码强度一般"," 密码强度强壮"); 
                $("span")[1].innerHTML=msg[num]; 
                if($("input")[2].value!=""){ 
                    check_pw(); 
                    } 
                return flag[2]=1; 
                check_data(); 
                } 
            } 
            //定义检测函数,返回0/1/2分别代表差/一般/强 
            function getResult(s){ 
                var ls =-1; 
                if (s.match(/[a-z]/ig)){ 
                    ls++; 
                } 
                if (s.match(/[0-9]/ig)){ 
                    ls++; 
                } 
                 if (s.match(/(.[^a-z0-9])/ig)){ 
                    ls++; 
                } 
                return ls; 
            } 
        //---------密码一致性检测     
            function check_pw(){ 
                var pwd=$("input")[1].value.toString(); 
                var check_pwd=$("input")[2].value.toString(); 
                if(flag[2]==1){ 
                    if(pwd==check_pwd){ 
                        $("span")[2].innerHTML=" 密码可以使用"; 
                        flag[3]=1; 
                        check_data(); 
                    } 
                    else{ 
                        $("span")[2].innerHTML=" 两次密码不相同"; 
                        flag[3]=0; 
                        check_data(); 
                    } 
                } 
            } 
        //---------用户名合法性检测 
            function check_id(id_name){//只能字母和数字,是否相同用AJAX判断 
                var reId=/^[wu0391-uFFE5]+$/; 
                var b_id=reId.test(id_name); 
                if(!b_id){ 
                    $("span")[0].innerHTML=" ID命名非法"; 
                    flag[4]=0; 
                    check_data(); 
                } 
                else{//合法用户名用ajax的checkid()检测是否被注册过 
                    checkid(id_name); 
                } 
            } 
        //---------检查数据,使提交按钮是否生效 
            function check_data(){ 
                if(flag[0]==1 && flag[1]==1 && flag[2]==1 && flag[3]==1 && flag[4]==1 && flag[5]==1){ 
                    $("input")[8].disabled=false; 
                } 
                else{ 
                    $("input")[8].disabled=true; 
                } 
            } 
    //-------------------------------------------------------------------- 
3.ajax.js view plaincopy to clipboardprint? 
function checkcode(regcode){        
    var xmlhttp;    
    try{    
        xmlhttp=new XMLHttpRequest();    
        }    
    catch(e){    
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    
        }    
    xmlhttp.onreadystatechange=function(){    
    if (xmlhttp.readyState==4){    
        if (xmlhttp.status==200){    
            var data=xmlhttp.responseText;    
            code_result(data);    
            }    
        else{    
            $("span")[4].innerHTML="验证码校验失败,请联系管理员";    
            }    
        }    
    else{    
        $("span")[4].innerHTML="正在进行验证码校验...";    
        }    
    }    
    xmlhttp.open("post", "check_code.asp", true);    
    xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');    
    xmlhttp.send("regcode="+escape(regcode));    
}    
function code_result(data){    
    var resultbox=$("span")[4];    
    if(data==1){    
        resultbox.innerHTML='IMG src="yesok.gif" 验证码正确';    
        flag[5]=1;    
        check_data();    
        }    
    else{    
        resultbox.innerHTML='IMG src="yesno.gif" 验证码错误';    
        flag[5]=0;    
        check_data();    
        }    
}    
//--------------------------------------------------------------------    
function checkid(regid){        
    var xmlhttp;    
    try{    
        xmlhttp=new XMLHttpRequest();    
        }    
    catch(e){    
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    
        }    
    xmlhttp.onreadystatechange=function(){    
    if (xmlhttp.readyState==4){    
        if (xmlhttp.status==200){    
            var data=xmlhttp.responseText;    
            id_result(data);    
            }    
        else{    
            $("span")[0].innerHTML="用户名检测失败,请联系管理员";    
            }    
        }    
    else{    
        $("span")[0].innerHTML="正在进行用户名校验...";    
        }    
    }    
    xmlhttp.open("post", "check_id.asp", true);    
    xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');    
    xmlhttp.send("regid="+escape(regid));    
}    
function id_result(data){    
    var resultbox=$("span")[0];    
    if(data==1){    
        resultbox.innerHTML='IMG src="yesok.gif" 用户名可用';    
        flag[4]=1;    
        check_data();    
        }    
    else{    
        resultbox.innerHTML='IMG src="yesno.gif" 该用户名已经被注册';    
        flag[4]=0;    
        check_data();    
    }    
}    
//--------------------------------------------------------------------    
function sendinfo(regname,pwd,email){    
    var xmlhttp;    
    try{    
        xmlhttp=new XMLHttpRequest();    
        }    
    catch(e){    
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    
        }    
    xmlhttp.onreadystatechange=function(){    
    if (xmlhttp.readyState==4){    
        if (xmlhttp.status==200){    
            var data=xmlhttp.responseText;    
            reg_result(data);    
            }    
        else{    
            $("span")[5].innerHTML="注册失败,请联系管理员";    
            }    
        }    
    else{    
        $("span")[5].innerHTML="正在进行用户名注册...";    
        }    
    }    
    xmlhttp.open("post", "reg.asp", true);    
    xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');    
    xmlhttp.send("regname="+escape(regname)+"&pwd="+escape(pwd)+"&email="+escape(email));    
}    
function reg_result(data){    
    if(data==1){    
        $("span")[5].innerHTML='A href="http://cceer.xmu.edu.cn/blog/" target=_blank'+$("input")[0].value+",您好.请点击这里登陆/A";    
        }    
    else{    
        $("span")[5].innerHTML="注册失败,请联系管理员";    
    }    
    }   
*这里是所有文件的打包下载(包括所有文件,图片,数据库等,解压后请在IIS下测试) 
良好体验度的注册系统.rar