Page 60 of 61

js判断用户设备

从腾讯新闻站的页面源码上的找到的一段判断用户设备的js代码,主要思路还是根据用户的userAgent中的关键词来匹配判断用户当前的设备是什么。

[code type=javascript]
if(!/Android|webOS|iPhone|Windows Phone|iPod|BlackBerry|SymbianOS/i.test(navigator.userAgent)){
window.location.href = ‘xxxx.ccc’;
}
[/code]

按需食用,可自行根据需要修改匹配字段中的关键字来取舍平台,比如自己的网站出了款ios的app,暂时没有安卓的,那么就可以把规则中的除‘iPhone|iPad|iPod’之外的设备关键词全都去掉,然后将if判断中的代码替换成加载展示某个浮动层提示用户可下载IOS的App。

另外推荐一个js库“https://github.com/matthewhudson/device.js”

Device.js 通过操作系统(比如 iOS,安卓,黑莓,Windows,Firefox OX),方向(横屏或者竖屏),类型(平板或者移动设备),比如在 iPhone 上的浏览的时候在添加的 CSS Class为‘ios iphone mobile’,前端开发者可以根据这些顶层class的不同针对不同的系统写出各自适配的样式。

PHP+JS 身份证号码有效性验证

PHP验证身份证号码有效性,可选是否验证用户性别

* 新的18位身份证号码各位的含义:
* 1-2位省、自治区、直辖市代码; 11-65
* 3-4位地级市、盟、自治州代码;
* 5-6位县、县级市、区代码;
* 7-14位出生年月日,比如19670401代表1967年4月1日;
* 15-17位为顺序号,其中17位男为单数,女为双数;
* 18位为校验码,0-9和X,由公式随机产生。
* 举例:
* 130503 19670401 0012这个身份证号的含义: 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001,2为验证码。
*
*
* 15位身份证号码各位的含义:
* 1-2位省、自治区、直辖市代码;
* 3-4位地级市、盟、自治州代码;
* 5-6位县、县级市、区代码;
* 7-12位出生年月日,比如670401代表1967年4月1日,这是和18位号码的第一个区别;
* 13-15位为顺序号,其中15位男为单数,女为双数;
* 与18位身份证号的第二个区别:没有最后一位的验证码。
* 举例:
* 130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001。
Continue reading

禁用页面选择、右键复制等

今天临时让改了一个东西,有作者反馈称小说章节阅读页现在居然可以选择和复制了,然后安排了我来排查处理了下,本来想找下原来的代码看下哪边出了问题的,但是找了半天没有一点头绪,索性就重新加了下禁用选择复制和鼠标右键的js代码了。
先是改的pc站上的,很容易直接js禁用页面的选择和右键。不过还是有点小插曲,本来想直接把代码写到head里的,试了下,不行。此时页面还没有加载出body标签,代码会报错。然后就直接写到jquery的document.ready里了。上传代码,成功!
[code type=javascript]
document.body.onselectstart = document.body.oncontextmenu = function(){return false;};
[/code]
接下来修改m站的阅读页,在chrome里手机浏览器模拟里测试不起来,鼠标的操作在模拟器本身就完全做不了选择操作。
Continue reading

根据银行卡号的前几位判断卡号信息

本判断需要依靠一个银行信息的记录,内容如下
bankList 下载下载Bank_list
[code type=php]
$bankList = [
‘621098’ => ‘邮储银行-绿卡通-借记卡’,
‘622150’ => ‘邮储银行-绿卡银联标准卡-借记卡’,
‘622151’ => ‘邮储银行-绿卡银联标准卡-借记卡’,
……
];

$card_8 = substr($card, 0, 8);
if (isset($bankList[$card_8])) {
return $bankList[$card_8];
}
$card_6 = substr($card, 0, 6);
if (isset($bankList[$card_6])) {
return $bankList[$card_6];
}
$card_5 = substr($card, 0, 5);
if (isset($bankList[$card_5])) {
return $bankList[$card_5];
}
$card_4 = substr($card, 0, 4);
if (isset($bankList[$card_4])) {
return $bankList[$card_4];
}[/code]

PHP+JS验证银行卡号

本规则只应对主流的LUHN卡号生成规则的银行卡,需要说明的LUHN规则只能验证卡号是否符合规则,并不能验证是否有这张卡。

关于LUHN卡号的信息:

LUHN算法,主要用来计算信用卡等证件号码的合法性。
1、从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,将两个位上数字相加保存。
2、把所有数字相加,得到总和。
3、如果信用卡号码是合法的,总和可以被10整除。
英文描述:
1.Counting from the check digit, which is the rightmost, and moving left, double the value of every second digit.
2.Sum the digits of the products (e.g., 10: 1 + 0 = 1, 14: 1 + 4 = 5) together with the undoubled digits from the original number.
3.If the total modulo 10 is equal to 0 (if the total ends in zero) then the number is valid according to the Luhn formula; else it is not valid.

LUHN算法或是LUHN公式,也被称作“模10算法”。它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证。该算法是由IBM的科学家Hans Peter LUHN所创造,于1954年1月6日提出该专利的申请,并于1960年8月23日被授予,在美国的专利号为2950048。
该算法一直都被大家所公用,并且时至今日应用也很广泛。它被指定在ISO/IEC7812-1。它的目的不是成为一种加密安全的哈希函数;它的目的是防止意外出现的错误,而不是恶意攻击。很多信用卡和众多的政府身份识别号码都使用该算法从一系列的随机数字中提取有效的数字。
优点和缺点
LUHN算法会检测到任何单码的错误以及几乎所有的相邻数字换位的错误。但是它不会检测两个数字序列09转90的错误(反之亦然)。它会检测到十分之七的相同双位数错误(不会检测到22和55的互换,33和66的互换,44和77的互换)。其他更复杂的检查数字算法,如费尔赫夫算法,可以检测出更多的转录错误。模N的Luhn算法是Luhn算法的一个扩展,支持非数字字符串。因为该算法采取了从右向左的方式,而且零位会影响计算的结果。只有当零位造成了数位的移动或是用零来填充一串数字的开头时才不会影响计算结果的生成。因此不论在将1234用零填充为0001234之前或是之后,使用LUHN算法得到的结果都是一样的。
该算法在美国专利上是为了给手持或是机械设备计算校验码。所以它必须尽可能的简单。

此代码验证主要为16或者19位。个别特殊位数的不好做处理
PHP代码

if(!$bank_card_number || (strlen($bank_card_number) != 16 && strlen($bank_card_number) != 19)){
echo json_encode(array('success'=>false,'data'=>array('msg'=>'银行卡号长度错误')));
exit;
}
$luhn_check = false;//是否对卡号进行luhn规则校验
if($luhn_check){
//luhn运算 校验卡号
$bank_card_number = (string)$bank_card_number;
$len = strlen($bank_card_number) - 1;
$sum = 0;
for($i = 1; $i <= $len; $i++){
if($i%2==1){
if($bank_card_number[$i-1]<5){ $sum += 2 * $bank_card_number[$i-1]; }else{ $sum += 2 * $bank_card_number[$i-1] - 9; } }else{ $sum += $bank_card_number[$i-1]; } } if( (intval($sum) + intval(substr($bank_card_number,-1,1))) % 10 != 0){ echo json_encode(array('success'=>false,'data'=>array('msg'=>'银行卡号错误')));
exit;
}
}

Javascript代码

/**
* Created by CheungQ on 8/7/2015.
*
* Description: 银行卡号Luhn校验算法
*
* luhn校验规则:16位银行卡号(19位通用):
*
* 1.将未带校验位的 15(或18)位卡号从右依次编号 1 到 15(18),位于奇数位号上的数字乘以 2。
* 2.将奇位乘积的个十位全部相加,再加上所有偶数位上的数字。
* 3.将加法和加上校验位能被 10 整除。
*
* bankno位银行卡号
*/
var Luhn = {
luhnCheck:function(bankno){
if(bankno.length != 16 && bankno.length !=19){
return false;
}

var lastNum=bankno.substr(bankno.length-1,1);//取出最后一位(与luhn进行比较)

var first15Num=bankno.substr(0,bankno.length-1);//前15或18位
var newArr=new Array();
for(var i=first15Num.length-1;i>-1;i--){ //前15或18位倒序存进数组
newArr.push(first15Num.substr(i,1));
}
var arrJiShu=new Array(); //奇数位*2的积 <9 var arrJiShu2=new Array(); //奇数位*2的积 >9

var arrOuShu=new Array(); //偶数位数组
for(var j=0;j<newArr.length;j++){
if((j+1)%2==1){//奇数位
if(parseInt(newArr[j])*2<9) arrJiShu.push(parseInt(newArr[j])*2); else arrJiShu2.push(parseInt(newArr[j])*2); } else //偶数位 arrOuShu.push(newArr[j]); } var jishu_child1=new Array();//奇数位*2 >9 的分割之后的数组个位数
var jishu_child2=new Array();//奇数位*2 >9 的分割之后的数组十位数
for(var h=0;h<arrJiShu2.length;h++){
jishu_child1.push(parseInt(arrJiShu2[h])%10);
jishu_child2.push(parseInt(arrJiShu2[h])/10);
}

var sumJiShu=0; //奇数位*2 < 9 的数组之和 var sumOuShu=0; //偶数位数组之和 var sumJiShuChild1=0; //奇数位*2 >9 的分割之后的数组个位数之和
var sumJiShuChild2=0; //奇数位*2 >9 的分割之后的数组十位数之和
var sumTotal=0;
for(var m=0;m<arrJiShu.length;m++){
sumJiShu=sumJiShu+parseInt(arrJiShu[m]);
}

for(var n=0;n<arrOuShu.length;n++){
sumOuShu=sumOuShu+parseInt(arrOuShu[n]);
}

for(var p=0;p<jishu_child1.length;p++){
sumJiShuChild1=sumJiShuChild1+parseInt(jishu_child1[p]);
sumJiShuChild2=sumJiShuChild2+parseInt(jishu_child2[p]);
}
//计算总和
sumTotal=parseInt(sumJiShu)+parseInt(sumOuShu)+parseInt(sumJiShuChild1)+parseInt(sumJiShuChild2);

//计算luhn值
var k= parseInt(sumTotal)%10==0?10:parseInt(sumTotal)%10;
var luhn= 10-k;

if(lastNum==luhn){
return true;//luhn验证通过
}
else{
return false;//luhn验证不通过
}
}
};

另外并不是所有的银行卡都是遵循LUHN规则生成卡号的,比如:

发行机构 卡号开始 使用 卡号长度 验证方式
American Express 34, 37 Yes 15 Luhn algorithm
Bankcard 5610, 560221-560225 No 16 Luhn algorithm
China UnionPay 62 Yes 16-19 no validation
Diners Club Carte Blanche 300-305 Yes 14 Luhn algorithm
Diners Club enRoute 2014, 2149 No 15 no validation

所以目前主要流行的银行卡验证方法是通过汇款转账一个数额较小的指定金额(如1元5角3分),通过这笔转账交易确认银行卡及持卡人的真实性。

JS +PHP验证电话号码

JS代码需要:jquery
[code type=javascript]
//验证手机号码或者电话号码
function checkContactNumber() {
$(“#error”).css(“display”, “none”);
var mobile = $.trim($(“#ContactNumber”).val());
var isMobile = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1})|(14[0-9]{1}))+\d{8})$/;
var isPhone = /^(?:(?:0\d{2,3})-)?(?:\d{7,8})(-(?:\d{3,}))?$/;;
var error = ““;
//如果为1开头则验证手机号码
if (mobile.substring(0, 1) == 1) {
if (!isMobile.exec(mobile) && mobile.length != 11) {
$(“#ContactNumber”).after(error);
$(“#ContactNumber”).focus();
return false;
}
}
//如果为0开头则验证固定电话号码
else if (mobile.substring(0, 1) == 0) {
if (!isPhone.test(mobile)) {
$(“#ContactNumber”).after(error);
$(“#ContactNumber”).focus();
return false;
}
}
//否则全部不通过
else {
$(“#ContactNumber”).after(error);
$(“#ContactNumber”).focus();
return false;
}
return true;
}
[/code]

PHP判断方法
[code type=php]
public function checkMobile($str)
{
$pattern = “/^(13|14|15|18)\d{9}$/”;
if (preg_match($pattern,$str))
{
return true;
}
else
{
return false;
}
}
[/code]

关于js性能优化

近期的一个项目,自助游分类页改造,外加接入国际散客票。

 

原本计划两个人1周多时间左右完成,但开始后但开始开发后才发现一个巨坑,该页面的js有3700+行之多

 

再三讨论之后,决定需要重构这部分的代码(因为新页面改造后页面代码、交互逻辑已经发生了翻天覆地的变化)。动手之前关注了下js优化的部分,故在此写记下(内容来源于网络) Continue reading