以前在我沒有編寫設定支付密碼的時候,以為這種效果(js)很好實作,結果當我做的時候布局到時很簡單,可是在用js的時候弄的我一個頭是兩個大。
第一次我是用一個input框,然後設定input的最大長度為6,然後用letter-space設定間距,和設計圖例的樣式完全不對不說,每一次輸入到最後一個的時候,input框文字始終要往前面退一格。
第二次寫的時候我是設定6個input密碼框,忽略到咯手機的鍵盤,每輸入一個input,鍵盤要隐藏一次,然後在繼續彈出鍵盤文字,弄咯好久也還是有瑕疵,反正實踐咯很多方法都有問題。
最後我在網上看見别人優秀的支付設定,是以我也試着自己弄一個出來。做飯還是和上面寫的第二次做的一樣,還是設定6個input輸入框,然後設定最大長度為一,就是一個輸入框裝一個數字。然後輸入的數字我是自己寫的模拟鍵盤,從0---9,然後添加一個删除按鈕即可,
1、首先我們要明白elements是做什麼的
elements 集合可傳回包含表單中所有元素的數組。
元素在數組中出現的順序和它們在表單的HTML 源代碼中出現的順序相同。
每個元素都有一個 type 屬性,其字元串值說明了元素的類型。
2、首先我們先把布局弄好。布局這個嘛相信都難不倒大家的。代碼如下,我都标有注釋的
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1,maximum-scale=1, user-scalable=no" />
<meta name="format-detection" content="telephone=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<title>模拟支付寶支付</title>
<style type="text/css">
*{margin:0;padding:0;}
body{ background:#ccc;font-family:'Microsoft Yahei';}
li{list-style: none;}
.box{padding:8% auto; height:250px;border:1px solid red; border-radius: 5px;background:pink;}
.box .apltitle{ line-height: 50px;text-align: center; font-size: 16px;padding:0 5%;margin-top: 10%;}
.box .password input{border:0; width:100%;text-align: center; line-height: 35px; font-size: 30px; font-weight: bold;}
/*numberBox*/
.numberBox{ position:fixed;width:100%; left:0; bottom:0; background:#fff; }
.numberBox li{ width:33.333%; line-height: 45px; float:left; text-align: center; font-size: 18px;border:1px solid #e0dfdf;
border-bottom:0;border-left: 0;
-webket-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;}
.numberBox li.border_right_none{border-right: 0;}
.numberBox li.grayBG{background:#ccc;}
.transparent{ color:transparent;}
/*模拟鍵盤數字*/
#password{ width:260px; margin:0 auto;background:blue;}
#password input{display:block; width:40px; height:40px; float:left;border:0;text-align: center; line-height: 40px; font-size: 30px; font-weight: bold;border:1px solid #aaa;border-left:0; margin-top: 15px;}
#password input:first-child{ border-left:1px solid #aaa;margin-left: 3%;}
.nextBtn{height:auto; overflow:hidden; width:100%;}
.nextBtn input{ width:90%;display:block;margin-left: 10%; border:0;margin:8% 5%; line-height: 45px; border-radius: 8px; background:orange; color:#fff;font-family:'Microsoft Yahei';}
.nextBtn input:hover{ background: #ccc; color:#fff;}
</style>
</head>
<body>
<div class="box">
<div class="apltitle"><span id="set_text"></span></div>
<!-- 6個input 輸入框 -->
<form action="" id="password">
<input type="text" maxLength="1" class="pass" readonly />
<input type="text" maxLength="1" class="pass" readonly />
<input type="text" maxLength="1" class="pass" readonly />
<input type="text" maxLength="1" class="pass" readonly />
<input type="text" maxLength="1" class="pass" readonly />
<input type="text" maxLength="1" class="pass" readonly />
</form>
<div class="nextBtn" ><input id="btn_next" style="color:red" type="button" value="下 一 步" disabled></div>
</div>
<!-- 數字number -->
<div class="numberBox" id="numberBox">
<ul id="keyboard" >
<li class="Num"><span class="off">1</span></li>
<li class="Num"><span class="off">2</span></li>
<li class="Num border_right_none"><span class="off">3</span></li>
<li class="Num"><span class="off">4</span></li>
<li class="Num"><span class="off">5</span></li>
<li class="Num border_right_none"><span class="off">6</span></li>
<li class="Num"><span class="off">7</span></li>
<li class="Num"><span class="off">8</span></li>
<li class="Num border_right_none"><span class="off">9</span></li>
<li class="cancle transparent grayBG">取消</li>
<li class="Num"><span class="off">0</span></li>
<li class="delete border_right_none grayBG">删除</li>
</ul>
</div>
</body>
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="js/setPassword.js"></script>
</html>
3、最難的來咯js控制。
a:設定一些要用到的全局變量
b:設定鍵盤數字的點選事件(點選一個數字把值穿給input,直達點選6個為止) 點選事件控制這裡的流程有點複雜,具體的看我代碼吧,上面我都有注釋的
/*
* @Author: Lydia
* @Description:仿制支付寶支付樣式流程控制
* @Date: 2017-02-13 16:13:18
* @Last Modified by name: Lydia
* @Last Modified time: 2017-02-14 15:03:07
*/
var pass_word='',//輸入的密碼
rePass_word='', //第二次輸入的确認密碼
passwords = $('#password').get(0),
check_pass_word='',n ,
inputLen = $("#password input");
var character;//中間變量
console.log("len:"+inputLen.length);
$("input.pass").attr("disabled",true);
$("#password").attr("disabled",true);
/*事件 */
$('#keyboard li').click(function(){
//删除操作
if ($(this).hasClass('delete')) {
for(var i= 0,len=passwords.elements.length-1;len>=i;len--){
console.log("ss:"+passwords.elements.length-1);
if($(passwords.elements[len]).val()!=''){
$(passwords.elements[len]).val('');
if($(passwords.elements[5]).val()== null ||$(passwords.elements[5]).val()==undefined||$(passwords.elements[5]).val()==''){
if(pass_word==''){
$("#btn_next").attr("disabled",true);
}
}
break;
}
}
return false;
}
//取消操作
if ($(this).hasClass('cancle')) {
console.log("次功能暫未開發");
//parentDialog.close();
pass_word = null;
return false;
}
//密碼操作
if ($(this).hasClass('Num') || $(this).hasClass('tab')){
character = $(this).text();
}
//第一次輸入的設定密碼
for(var i= 0,len=passwords.elements.length;i<len;i++){
if($(passwords.elements[i]).val()==null ||$(passwords.elements[i]).val()==undefined||$(passwords.elements[i]).val()==''){
$(passwords.elements[i]).val(character);
break;
}
}
//第二次輸入确認密碼情況
if(!($(passwords.elements[5]).val() == null ||$(passwords.elements[5]).val()==undefined||$(passwords.elements[5]).val()=='')) {
if (pass_word == '') {
$("#btn_next").removeAttr("disabled");
} else {
var temp_rePass_word = '';
for (var i = 0; i < passwords.elements.length; i++) {
temp_rePass_word += $(passwords.elements[i]).val();
}
rePass_word = temp_rePass_word;
console.log("第二次輸入密碼:"+rePass_word);
//$("#keyboard").hide("rePass_word:"+rePass_word);
//這裡是判斷密碼不為空并且與起初設定的密碼一緻
if(rePass_word!='' && pass_word==rePass_word){
$("#numberBox").hide();
var result_text='\
<span>兩次密碼一緻</span>\
<span style="color: red;">正在自動跳轉</span>\
';
$("#set_text").html(result_text);
$("input.pass").attr("disabled",true);
$("#password").attr("disabled",true);
//輸入密碼正确的話網頁跳轉到百度去
var t=2;
var t1 = window.setInterval(function(){
t--;
if(t==0){
window.clearInterval(t1);
var phone = $("#cellPhone").val();
window.location.href="http://www.baidu.com/" target="_blank" rel="external nofollow" ;
}
},1000);
}else{
//兩次輸入密碼不一緻的情況
var result_text='\
<span>兩次</span>\
<span style="color: red;">提貨密碼</span>\
<span>不一緻,請重新輸入</span>\
';
$("#set_text").html(result_text);
for(var i=0;i<passwords.elements.length;i++){
$(passwords.elements[i]).val('');
}
rePass_word='';
$("#keyboard").show();
}
}
}
return false;
});
//下一步
$("#btn_next").click(function(){
if(pass_word.length<6){
console.log("密碼必須為6位數!");
}
var reset_text='\
<span>請再次輸入</span>\
<span style="color: red;">提貨密碼</span>\
';
$("#set_text").html(reset_text);
var temp_password='';
for(var i=0;i<passwords.elements.length;i++){
temp_password+=$(passwords.elements[i]).val();
$(passwords.elements[i]).val('');
}
pass_word=temp_password;
console.log("密碼是:"+pass_word);
$(".nextBtn").attr("hidden",true);
});
(function () {
function tabForward(e) {
e = e || window.event;
var target = e.target || e.srcElement;
if (target.value.length === target.maxLength) {
var form = target.form;
for (var i = 0, len = form.elements.length-1; i < len; i++) {
if (form.elements[i] === target) {
if (form.elements[i++]) {
form.elements[i++].focus();
}
break;
}
}
}
}
var form = document.getElementById("password");
form.addEventListener("keyup", tabForward, false);
var set_text='\
<span>設定</span>\
<span style="color: red;">提貨密碼</span>\
<span>,建議與</span>\
<span style="color: red;">登陸密碼</span>\
<span>不同</span>\
';
$("#set_text").html(set_text);
})();
這裡為咯能快速檢視,是以我使用的input type為text ,當要用到實際的項目中隻需要把type 改為 password 即可。
有什麼不懂的可以call 我
