天天看點

mui學習筆記2-登陸模闆代碼分析

廢話就不多說了,直接上官方登陸模闆代碼加注釋

<!DOCTYPE html>
<html class="ui-page-login">

	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title></title>
		<link href="css/mui.min.css" target="_blank" rel="external nofollow"  rel="stylesheet" />
		<link href="css/style.css" target="_blank" rel="external nofollow"  rel="stylesheet" />
		<style>
			.area {
				margin: 20px auto 0px auto;
			}
			
			.mui-input-group {
				margin-top: 10px;
			}
			/*對input元素的第一個節點設定上邊距*/
			.mui-input-group:first-child {
				margin-top: 20px;
			}
			
			.mui-input-group label {
				width: 22%;
			}
			
			.mui-input-row label~input,
			.mui-input-row label~select,
			.mui-input-row label~textarea {
				width: 78%;
			}
			
			.mui-checkbox input[type=checkbox],
			.mui-radio input[type=radio] {
				top: 6px;
			}
			
			.mui-content-padded {
				margin-top: 25px;
			}
			
			.mui-btn {
				padding: 10px;
			}
			
			.link-area {
				display: block;
				margin-top: 25px;
				text-align: center;
			}
			
			.spliter {
				color: #bbb;
				padding: 0px 8px;
			}
			
			.oauth-area {
				position: absolute;
				bottom: 20px;
				left: 0px;
				text-align: center;
				width: 100%;
				padding: 0px;
				margin: 0px;
			}
			
			.oauth-area .oauth-btn {
				display: inline-block;
				width: 50px;
				height: 50px;
				background-size: 30px 30px;
				background-position: center center;
				background-repeat: no-repeat;
				margin: 0px 20px;
				/*-webkit-filter: grayscale(100%); */
				border: solid 1px #ddd;
				border-radius: 25px;
			}
			
			.oauth-area .oauth-btn:active {
				border: solid 1px #aaa;
			}
			
			.oauth-area .oauth-btn.disabled {
				background-color: #ddd;
			}
		</style>

	</head>

	<body>
		<header class="mui-bar mui-bar-nav">
			<h1 class="mui-title">登入</h1>
		</header>
		<!--之前說過mui的頁面結構一般是mheader+mbody-->
		<div class="mui-content">
			<form id='login-form' class="mui-input-group">
				<div class="mui-input-row">
					<label>賬号</label>
					<input id='account' type="text" class="mui-input-clear mui-input" placeholder="請輸入賬号">
				</div>
				<div class="mui-input-row">
					<label>密碼</label>
					<input id='password' type="password" class="mui-input-clear mui-input" placeholder="請輸入密碼">
				</div>
			</form>
			<form class="mui-input-group">
				<ul class="mui-table-view mui-table-view-chevron">
					<li class="mui-table-view-cell">
						自動登入
						<!--開關元件,id用于判斷是否打開自動登陸開關-->
						<div id="autoLogin" class="mui-switch">
							<div class="mui-switch-handle"></div>
						</div>
					</li>
				</ul>
			</form>
			<div class="mui-content-padded">
				<button id='login' class="mui-btn mui-btn-block mui-btn-primary">登入</button>
				<div class="link-area"><a id='reg'>新增賬號</a> <span class="spliter">|</span> <a id='forgetPassword'>忘記密碼</a>
				</div>
			</div>
			<!--快捷登陸方式權鑒,初始時并未設定,但在真機環境下運作是可以看到此處會有3種
				快捷登陸的按鈕
			-->
			<div class="mui-content-padded oauth-area">

			</div>
		</div>
		<script src="js/mui.min.js"></script>
		<script src="js/mui.enterfocus.js"></script>
		<script src="js/app.js"></script>
		<script>
			//将mui,document使用$和doc代替
			(function($, doc) {
				//等價于mui.init()
				$.init({
					statusBarBackground: '#f7f7f7'
				});
				//h5+事件的準備,所有的h5+事件必須經過初始化
				$.plusReady(function() {
					//禁止螢幕翻轉選項
					plus.screen.lockOrientation("portrait-primary");
					//H5+事件擷取設定和狀态
					var settings = app.getSettings();
					var state = app.getState();
					//定義首頁視圖
					var mainPage = plus.webview.getWebviewById("main");
					//定義加載完畢标記,并初始化為未完成首頁加載
					var main_loaded_flag = false;
					if(!mainPage){
						//若首頁未加載,則進行mui.perload()     預加載,設定id和路徑,此處id與前四行的id對應
						mainPage = $.preload({
							"id": 'main',
							"url": 'main.html'
						});
					}else{
						main_loaded_flag = true;
					}
					//添加監聽事件,事件類型為加載
					mainPage.addEventListener("loaded",function () {
						main_loaded_flag = true;
					});
					//跳轉首頁面函數
					var toMain = function() {
						//使用定時器的原因:
						//可能執行太快,main頁面loaded事件尚未觸發就執行自定義事件,此時必然會失敗
						var id = setInterval(function () {
							if(main_loaded_flag){
								//setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或視窗被關閉。
								//由 setInterval() 傳回的 ID 值可用作 clearInterval() 方法的參數。
								clearInterval(id);
								/*
								 * mui的fire函數觸發目标視窗的自定義事件
								 * 此處目标視窗為主視窗,方法為show方法,不攜帶參數清單
								 */
								$.fire(mainPage, 'show', null);
								mainPage.show("pop-in");
							}
						},20);//事件間隔為20ms
					};
					//檢查 "登入狀态/鎖屏狀态" 開始
					if (settings.autoLogin && state.token && settings.gestures) {
						//設定了手勢解鎖
						$.openWindow({
							url: 'unlock.html',
							id: 'unlock',
							show: {
								aniShow: 'pop-in'
							},
							waiting: {
								autoShow: false
							}
						});
					} else if (settings.autoLogin && state.token) {
						//未設定手勢解鎖直接跳轉至首頁main
						toMain();
					} else {
						app.setState(null);
						//第三方登入
						
						var authBtns = ['qihoo', 'weixin', 'sinaweibo', 'qq']; //配置業務支援的第三方登入
						var auths = {};
						var oauthArea = doc.querySelector('.oauth-area');
						plus.oauth.getServices(function(services) {
							for (var i in services) {
								var service = services[i];
								auths[service.id] = service;
								if (~authBtns.indexOf(service.id)) {
									var isInstalled = app.isInstalled(service.id);
									var btn = document.createElement('div');
									//如果微信未安裝,則為不啟用狀态
									btn.setAttribute('class', 'oauth-btn' + (!isInstalled && service.id === 'weixin' ? (' disabled') : ''));
									btn.authId = service.id;
									btn.style.backgroundImage = 'url("images/' + service.id + '.png")'
									oauthArea.appendChild(btn);
								}
							}
							$(oauthArea).on('tap', '.oauth-btn', function() {
								if (this.classList.contains('disabled')) {
									plus.nativeUI.toast('您尚未安裝微信用戶端');
									return;
								}
								var auth = auths[this.authId];
								var waiting = plus.nativeUI.showWaiting();
								auth.login(function() {
									waiting.close();
									plus.nativeUI.toast("登入認證成功");
									auth.getUserInfo(function() {
										plus.nativeUI.toast("擷取使用者資訊成功");
										var name = auth.userInfo.nickname || auth.userInfo.name;
										app.createState(name, function() {
											toMain();
										});
									}, function(e) {
										plus.nativeUI.toast("擷取使用者資訊失敗:" + e.message);
									});
								}, function(e) {
									waiting.close();
									plus.nativeUI.toast("登入認證失敗:" + e.message);
								});
							});
						}, function(e) {
							oauthArea.style.display = 'none';
							plus.nativeUI.toast("擷取登入認證失敗:" + e.message);
						});
					}
					// close splash
					setTimeout(function() {
						//關閉 splash
						plus.navigator.closeSplashscreen();
					}, 600);
					//檢查 "登入狀态/鎖屏狀态" 結束
					var loginButton = doc.getElementById('login');
					var accountBox = doc.getElementById('account');
					var passwordBox = doc.getElementById('password');
					var autoLoginButton = doc.getElementById("autoLogin");
					var regButton = doc.getElementById('reg');
					var forgetButton = doc.getElementById('forgetPassword');
					//點選登陸事件後觸發
					loginButton.addEventListener('tap', function(event) {
						var loginInfo = {
							account: accountBox.value,
							password: passwordBox.value
						};
						app.login(loginInfo, function(err) {
							if (err) {
								plus.nativeUI.toast(err);
								return;
							}
							toMain();
						});
					});
					//擷取焦點
					$.enterfocus('#login-form input', function() {
						$.trigger(loginButton, 'tap');
					});
					autoLoginButton.classList[settings.autoLogin ? 'add' : 'remove']('mui-active')
					autoLoginButton.addEventListener('toggle', function(event) {
						setTimeout(function() {
							var isActive = event.detail.isActive;
							settings.autoLogin = isActive;
							app.setSettings(settings);
						}, 50);
					}, false);
					regButton.addEventListener('tap', function(event) {
						$.openWindow({
							url: 'reg.html',
							id: 'reg',
							preload: true,
							show: {
								aniShow: 'pop-in'
							},
							styles: {
								popGesture: 'hide'
							},
							waiting: {
								autoShow: false
							}
						});
					}, false);
					forgetButton.addEventListener('tap', function(event) {
						$.openWindow({
							url: 'forget_password.html',
							id: 'forget_password',
							preload: true,
							show: {
								aniShow: 'pop-in'
							},
							styles: {
								popGesture: 'hide'
							},
							waiting: {
								autoShow: false
							}
						});
					}, false);
					//
					window.addEventListener('resize', function() {
						oauthArea.style.display = document.body.clientHeight > 400 ? 'block' : 'none';
					}, false);
					//
					var backButtonPress = 0;
					$.back = function(event) {
						backButtonPress++;
						if (backButtonPress > 1) {
							plus.runtime.quit();
						} else {
							plus.nativeUI.toast('再按一次退出應用');
						}
						setTimeout(function() {
							backButtonPress = 0;
						}, 1000);
						return false;
					};
				});
			}(mui, document));
		</script>
	</body>

</html>