网易,佳人有约登录效果
我们先把上面拆解出来的功能完成!
1。透明层(显示与隐藏)
关键是要同时设置下面这几个样式,才能使主流浏览器上都现实透明的效果。
filter= Alpha(Opacity=50);
MozOpacity =0.5;
opacity=0.5;
可能很多人都知道,类似这种在透明层上现实东西的效果,多源至于一个称为lightbox的效果。这里我也这样命名:
function Lightbox(id)
{
this.box = this.createBox();
this.id = id||lightbox_id;
}
Lightbox.prototype=
{
createBox:function(){
var box = document.getElementById(this.id)||document.createElement(div);
box.id = box.id||this.id;
with(box.style){
position=absolute;
left=0;
top=0;
width=100%;
height=100%;
zIndex=1000;
background=http://pic3.phprm.com/2013/09/05/#ccc.jpg;
filter= Alpha(Opacity=50);
MozOpacity =0.5;
opacity=0.5;
display=none;
}
document.body.appendChild(box);
return box;
},
show:function(){
this.box.style.height= document.documentElement.scrollHeight+px;
this.box.style.display = ;
},
hide:function(){
this.box.style.display = none;
}
}
2。表单提交(ajax或iframe)
迅雷上的是用的iframe,我们这里先说iframe
iframe就简单多了,form的target属性设置为某个iframe的name就可以了。设置iframe的onload属性,那么当表单提交完成以后他就会执行相应处理。
<!--表单上的设置-->
<form id="login_form" action="login.php" target="login_submit_iframe" method="post">
<!--iframe上的设置-->
<iframe name="login_submit_iframe" id="login_submit_iframe" style="display:none;" width="0" height="0" ></iframe>
如果用ajax的话,代码也很简单。可能大家用的js框架不一样。但绝大多数都大同小异,我相信大家一看就知道是什么意思。
类我就不在这列举了,我只写一下怎么用它。
这其实就是ajax in action这本书上的那个net类。
/*很多人可能会说,为什么没用encodeURIComponent避免乱码?这里不需要使用encodeURIComponent了,在类里面调用过了*/
/**
* login.php:登陆验证页[废话]
* Login.checkLogin:ajax回调函数[废话]
* loadXMLDoc的参数,表单里要传递的数据[废话]
*/
new Ajax(login.php,Login.checkLogin).loadXMLDoc({
username:document.getElementById(username).value,
password:document.getElementById(password).value,
vcode:document.getElementById(vcode).value
});
3。select的显示与隐藏,以及cookie操作。
既然select不能被div挡住,那就把他干掉吧!
var Select={
show:function(){
var selects=document.getElementsByTagName(select);
for(var m=0;m<selects.length;m++) selects[m].style.visibility="visible";
},
hide:function(){
var selects=document.getElementsByTagName(select);
for(var m=0;m<selects.length;m++) selects[m].style.visibility="hidden";
}
}
还要准备一套cookie函数
网络最大的好处:对于某些问题,你只需知道该干什么就可以了,至于具体该怎么做已经有人帮你做好了。
下面我就随便在论坛里搜了一下,就找到了一个
http://www.phpchina.com/bbs/view ... a=page=1&sid=4jSn3r
var Cookie=
{
check:function(){
//判断cookie是否开启
var cookieEnabled=(navigator.cookieEnabled)? true : false;
//如果浏览器不是ie4+或ns6+
if (typeof navigator.cookieEnabled=="undefined" && !cookieEnabled){
document.cookie="testcookie";
cookieEnabled=(document.cookie=="testcookie")? true : falsedocument.cookie="";
}
//如果没有开启
if(cookieEnabled){
return true;
}else{
return false;
}
},
add:function(name,value,expireHours){
var cookieString=name+"="+escape(value);
//判断是否设置过期时间
if(expireHours>0){
var date=new Date();
date.setTime(date.getTime+expireHours*3600*1000);
cookieString=cookieString+"; expire="+date.toGMTString();
}
document.cookie=cookieString;
},
get:function(name){
var strCookie=document.cookie;
var arrCookie=strCookie.split("; ");
for(var m=0;m<arrCookie.length;m++){
var arr=arrCookie[m].split("=");
if(arr[0]==name){
return unescape(arr[1]);
}
}
return false;
},
del:function(name){
var date=new Date();
date.setTime(date.getTime()-10000);
document.cookie=name+"=; expire="+date.toGMTString();
}
}
4。前面提到的回调函数以及后台的两个页面
最后再说一下前面提到的回调函数Login.checkLogin。登陆后你需要做什么,写在Login.loginSuccess里就行了,最后为了方便使用稍有改变。
/*这里没有检验是否支持cookie,在login弹出的时候检测了.不支持cookie的话,登陆窗口都弹不出来。*/
var Login=
{
statu: 0,
/*这就是里登陆成功的话,需要做的处理。通常是把整个页面登陆前后不同的地方处理一下。你可以重载一下*/
loginSuccess:function(){
document.getElementById(login_result).innerHTML=Cookie.get(username)+已经登陆;
alert(登陆成功了!);
},
/*这就是里登陆失败的话,需要做的处理。通常是把整个页面登陆前后不同的地方处理一下。你可以重载一下*/
loginOutSuccess:function(){
document.getElementById(login_result).innerHTML=Cookie.get(username)+刚成功退出;
alert(退出成功!);
},
checkLogin:function(){
if(Login.statu==1&&Cookie.get(loginStatu)==1){
new LoginDialog(login_box).hide();
Login.loginSuccess();
}else if(Login.statu==2&&Cookie.get(loginStatu)==0){
Login.statu=0;
Login.loginOutSuccess();
}else if(Login.statu==1){
alert(请检查你的用户名,密码以及验证码!);
}
},
getVcode:function(){
document.getElementById(verify_code).src=vcode.php?cachetime=+new Date().getTime();
},
loginOut:function(){
Login.statu=2;
document.getElementById(login_submit_iframe).contentWindow.location=loginout.php;
}
}
后台的代码我就不细说了,各自系统有各自的区别。我这里把测试用的代码贴出来,并说一下这些文件该做什么,你只要保证的你页面有这些作用就行了。
<?php
/**
* header里设置的字符编码格式要和你前台的一致,否则当出现双字节字符的时候就会出现乱码.
* 其他的都可以用setCookie的方式,写在cookie里传到前台。
* 其中标志登陆成功的 loginStatu必须设为1,其他的就看你的登陆是怎么处理的了
*/
header(content-type:text/html; charset=utf-8);
session_start();
$username = phpchina;
$password = phpchina;
if($username==$_POST[username]&&$password==$_POST[password]&&$_SESSION[vcode]==$_POST[vcode]){
setcookie(username,phpchina);
setcookie(loginStatu,1);
}?>
/*验证码程序就不用说了吧!我这里是测试用的,所以就随便截了个时间做验证码*/
<?php
session_start();
$_SESSION[vcode] = substr(time(),-4);
$im = imagecreatetruecolor(40, 20);
$bg = imagecolorallocate($im, 225, 225, 225);
$textcolor = imagecolorallocate($im, 0, 0, 0);
imagefill($im,1,1,$bg);
imagestring($im, 5, 0, 0, $_SESSION[vcode], $textcolor);
header("Content-type:image/jpeg");
imagejpeg($im);
?>
最后看看LoginDialog类理解全过程:
function LoginDialog(formid)
{
this.dialog = document.getElementById(formid||login_box);
this.overDiv = this.overDiv ||new Lightbox();
}
LoginDialog.prototype =
{
show:function(){
if(!Cookie.check()){alert(你的浏览器不支持cookie,无法正常登陆);return}
else if(Cookie.get(loginStatu)==1){alert(你已经登陆!);return}
Login.statu=1;
this.overDiv.show();
Select.hide();
Login.getVcode();
this.dialog.style.display=;
},
hide:function(){
Login.statu=0;
this.overDiv.hide();
Select.show()
this.dialog.style.display=none;
}
}
主要是看show()
hide()只是还原操作
//当不支持cookie的时候提示错误,并退出
if(!Cookie.check()){alert(你的浏览器不支持cookie,无法正常登陆);return}
//当支持cookie而cookie.loginstatu的值为1时,说明已经登陆。就不用重复登陆了。
else if(Cookie.get(loginStatu)==1){alert(你已经登陆!);return}
//设置Login.statu=1;表示当前正在做登陆操作
Login.statu=1;
//透明背景层显示
this.overDiv.show();
//隐藏select
Select.hide();
//刷新验证码
Login.getVcode();
//显示登陆窗口
this.dialog.style.display=;
在完成以上这些步骤以后,就是分为iframe还是ajax两种方式提交表单了。
而提交完表单后:
如果是iframe形式提交,iframe的onload事件会调用Login.checkLogin(),当check成功时,他会对应调用Login.loginSuccess()和Login.loginOutSuccess()
而ajax则是把Login.checkLogin做为回调函数来激活。
因此,登陆成功后具体做什么由 Login.loginSuccess()和Login.loginOutSuccess()决定。使用的时候,重载一下它们就可以了。
本文地址:http://www.phprm.com/frame/php1004847.html
转载随意,但请附上文章地址:-)