由豆瓣注册页面所想到的(求助)
犹豫良久,冒死发上首页,希望牛人指点,同时也做好了心理准备,准备受喷...
废话不多说,直接上主题,之前是看到Douban的jquery使用技巧 ,所以才会去豆瓣逛逛,所以才有了此文....
在注册页面,由于我的粗心,我少填了一个数字:
换一种填写方式:
当然,你换其他的输入方式也会有某些匹配,域名会自动提示呀,是某种匹配起了作用,我的好奇心驱使我一探究竟...
查看源文件发现这个自动提示是JS在起作用,分析代码吧:
email.blur(function(){
check_email(1);
});
check_email(1);
});
email是就是上面输入框的jQuery对象,blur时调用了check_email方法,以下就是check_email方法
代码
function check_email(like){
e_hint.fadeOut();
r = 1;
s = email.attr('value');
if (!s){
r = 0;
e_hint.fadeIn();
}else if (!email_reg.exec(s)){
e_hint.html('请输入正确的Email地址');
e_hint.fadeIn();
r = 0;
}else{
e_hint.fadeOut();
r = 1;
s = email.attr('value');
if (!s){
r = 0;
e_hint.fadeIn();
}else if (!email_reg.exec(s)){
e_hint.html('请输入正确的Email地址');
e_hint.fadeIn();
r = 0;
}else{
//这段代码只需关注这个分支,上文中我碰到的两种情况就是代码能跑到这个if分支里,从而有全局变量e_domain作为提示域名,而该段代码
//运行的前提条件是like && get_like(s)
if (like && get_like(s)){
as = ' <a id="yes_but" href="javascript:void(0)" onclick="e_set()">是</a>/<a href="javascript:void(0)" onclick="e_back()">不是</a>'
e_correct.html('<div class="ct"><span class="pl">你是否要输入' + e_name + '@</span>' + e_domain + as + '</div>');
$("#yes_but").focus();
e_tip_on = 1; }
//运行的前提条件是like && get_like(s)
if (like && get_like(s)){
as = ' <a id="yes_but" href="javascript:void(0)" onclick="e_set()">是</a>/<a href="javascript:void(0)" onclick="e_back()">不是</a>'
e_correct.html('<div class="ct"><span class="pl">你是否要输入' + e_name + '@</span>' + e_domain + as + '</div>');
$("#yes_but").focus();
e_tip_on = 1; }
else{
e_hint.fadeOut();
var url = '/j/register/is_registered?email='+s;
$.getJSON(url, function(j){
if (j.ok){
e_hint.html('该Email已经注册过');
e_hint.fadeIn();
email_value = s;
r = 0;
}
else{
r = 1;
}
})
}
}
email_value = email.attr('value');
return r
};
e_hint.fadeOut();
var url = '/j/register/is_registered?email='+s;
$.getJSON(url, function(j){
if (j.ok){
e_hint.html('该Email已经注册过');
e_hint.fadeIn();
email_value = s;
r = 0;
}
else{
r = 1;
}
})
}
}
email_value = email.attr('value');
return r
};
get_like方法:
代码
var email_list = new Array('163.com','126.com', '139.com', '188.com', '2008.china.com', '2008.sina.com', '21cn.com', '263.net', 'china.com', 'chinaren.com', 'citiz.net', 'eyou.com', 'foxmail.com', 'gmail.com', 'hongkong.com', 'hotmail.com', 'live.cn', 'live.com', 'mail.china.com', 'msn.com', 'my3ia.sina.com', 'qq.com', 'sina.cn', 'sina.com', 'sina.com.cn', 'sogou.com', 'sohu.com', 'tom.com', 'vip.163.com', 'vip.qq.com', 'vip.sina.com', 'vip.sohu.com', 'vip.tom.com', 'yahoo.cn', 'yahoo.com', 'yahoo.com.cn', 'yahoo.com.hk', 'yahoo.com.tw', 'yeah.net');
//作用域为全局的数组
function get_like(s){
r = 0;
v = s.split('@');//以@作为分隔符
domain = v[1]; //该domain就是用户所填写的域名,比如上图中我填写的16.com
e_name = v[0]; //e_name是邮箱用户名,对应上图的tmac
dis = domain.length;
function get_like(s){
r = 0;
v = s.split('@');//以@作为分隔符
domain = v[1]; //该domain就是用户所填写的域名,比如上图中我填写的16.com
e_name = v[0]; //e_name是邮箱用户名,对应上图的tmac
dis = domain.length;
//关键就在这里了,它做了一个循环把每个正常的域名与用户填写的域名分别作为参数传入一个DPA的方法中,然后得出一个数字d,该数字d与用户所输用户名的长度相比,如果小的话,就用e作为提示的域名,并且还要满足dis && dis < 4才能返回1
for (k=0; k < email_list.length; k++){
e = email_list[k];
d = DPA(domain, e);
for (k=0; k < email_list.length; k++){
e = email_list[k];
d = DPA(domain, e);
if (d < dis){
dis = d;
e_domain = e;
}
}
if(dis && dis < 4){
r = 1;
}
return r;
};
//该方法根据2个字符的长度构造了一个二维数组,返回的是二维数组中最后数字。
function DPA(s1, s2){//s1 is uer's domain and s2 is a real domain
var m = new Array();
var i, j;
for(i=0; i < s1.length + 1; i++) m[i] = new Array(); // i.e. 2-D array
m[0][0] = 0; // boundary conditions
for(j=1; j <= s2.length; j++)
m[0][j] = m[0][j-1]-0 + 1; // boundary conditions
for(i=1; i <= s1.length; i++) // outer loop
{
m[i][0] = m[i-1][0]-0 + 1; // boundary conditions
for(j=1; j <= s2.length; j++) // inner loop
{
var diag = m[i-1][j-1];
if( s1.charAt(i-1) != s2.charAt(j-1) ) diag++;
m[i][j] = Math.min( diag, // match or change
Math.min( m[i-1][j]-0 + 1, // deletion
m[i][j-1]-0 + 1 ) ) // insertion
}//for j
}//for i
return m[s1.length][s2.length];
}
e_domain = e;
}
}
if(dis && dis < 4){
r = 1;
}
return r;
};
//该方法根据2个字符的长度构造了一个二维数组,返回的是二维数组中最后数字。
function DPA(s1, s2){//s1 is uer's domain and s2 is a real domain
var m = new Array();
var i, j;
for(i=0; i < s1.length + 1; i++) m[i] = new Array(); // i.e. 2-D array
m[0][0] = 0; // boundary conditions
for(j=1; j <= s2.length; j++)
m[0][j] = m[0][j-1]-0 + 1; // boundary conditions
for(i=1; i <= s1.length; i++) // outer loop
{
m[i][0] = m[i-1][0]-0 + 1; // boundary conditions
for(j=1; j <= s2.length; j++) // inner loop
{
var diag = m[i-1][j-1];
if( s1.charAt(i-1) != s2.charAt(j-1) ) diag++;
m[i][j] = Math.min( diag, // match or change
Math.min( m[i-1][j]-0 + 1, // deletion
m[i][j-1]-0 + 1 ) ) // insertion
}//for j
}//for i
return m[s1.length][s2.length];
}
不明白的问题就在这了,在DPA的方法中构造出来一个二维数组,通过循环迭代从而返回数组中的最后一个元素,作为返回值与用户所输入的域名的长度比较,我所疑惑的是:
1:为什么要构造这样一个二维数组?
2:为什么该二维数组的最后一个元素比用户所输入的域名长度dis短的话,这个时候的e就是check_email方法中用来提示的e_domain(也就是最终显示在界面上提示的域名) ?
求教各位大神~~