摘要:由于網(wǎng)絡(luò)等各方面原因,有時執(zhí)行一個操作時有時需要等待比較長的時間,如果不進行特殊處理就無法知道當前操作的狀態(tài),嚴重影響用戶體驗。為了解決上面的問題,考慮利用的對執(zhí)行長操作時需要進行控制的元素進行設(shè)置,實現(xiàn)以元素為單位進行頁面狀態(tài)的控制。
由于網(wǎng)絡(luò)等各方面原因,有時執(zhí)行一個ajax操作時有時需要等待比較長的時間,如果不進行特殊處理就無法知道當前操作的狀態(tài),嚴重影響用戶體驗。
比較常見的解決方案是執(zhí)行可能的長操作前先打開一個蒙版,覆蓋頁面,通過動畫指示當前頁面處于執(zhí)行狀態(tài),獲得返回結(jié)果后在關(guān)閉蒙版。這種方式雖然可以很清晰的展現(xiàn)正在等待操作結(jié)果的狀態(tài),但是對于網(wǎng)絡(luò)條件比較好,操作結(jié)果很快就返回的情況,會給用戶造成一種頁面閃爍的感覺,也會影響用戶體驗。
為了解決上面的問題,考慮利用angular的directive對執(zhí)行長操作時需要進行控制的元素進行設(shè)置,實現(xiàn)以元素為單位進行頁面狀態(tài)的控制。
需要進行狀態(tài)控制的元素有幾類:1、input元素,執(zhí)行長操作時它們應(yīng)該處于disabled狀態(tài);2、button等發(fā)起操作的元素,它們應(yīng)該出于disabled的狀態(tài),同時發(fā)起正在執(zhí)行的長操作的元素應(yīng)該出于running的狀態(tài),例如:通過動畫。
實現(xiàn)思路如下:
1、定義directive,tms-lock
app = angular.module("app", []); app.directive("tmsLock", function() { return { restrict: "A", scope: { lock: "=tmsLock" }, priority: 99, compile: function(tElem, tAttrs) { var originalFn, lockableFn; if (tAttrs.tmsLockPromoter === "Y" && tAttrs.ngClick) { originalFn = tAttrs.ngClick; lockableFn = "__lockable__" + originalFn; tAttrs.ngClick = lockableFn; } return { pre: function(scope, iElem, iAttrs) { if (lockableFn) { scope.$parent[lockableFn.replace(/(.*)/, "")] = function() { var eleIndicator = document.createElement("div"); eleIndicator.classList.add("indicator"); scope.lock = true; iElem.addClass("tms-lock-running"); iElem.append(eleIndicator); scope.$parent[originalFn.replace(/(.*)/, "")].apply(scope, arguments).then(function() { scope.lock = false; iElem.removeClass("tms-lock-running"); iElem[0].removeChild(eleIndicator); }); }; } scope.$watch("lock", function(locked) { if (locked === true) { iElem.addClass("tms-locked"); iAttrs.$set("disabled", true); } else if (locked === false) { iElem.removeClass("tms-locked"); iAttrs.$set("disabled", undefined); } }); } } } } }); app.controller("ctrl", ["$scope", "$q", "$timeout", function($scope, $q, $timeout) { $scope.lock = false; $scope.longFn = function() { var defer; defer = $q.defer(); $timeout(function() { defer.resolve(); }, 10000); return defer.promise; }; $scope.otherFn = function() { // do nothing }; }]);
2、設(shè)置運行狀態(tài)的樣式
@keyframes tmsRunning{ 0%{transform:rotate(0deg);} 12%{transform:rotate(45deg);} 25%{transform:rotate(90deg);} 37%{transform:rotate(135deg);} 50%{transform:rotate(180deg);} 62%{transform:rotate(225deg);} 75%{transform:rotate(270deg);} 87%{transform:rotate(315deg);} 100%{transform:rotate(360deg);} } @-webkit-keyframes tmsRunning{ 0%{-webkit-transform:rotate(0deg);} 12%{-webkit-transform:rotate(45deg);} 25%{-webkit-transform:rotate(90deg);} 37%{-webkit-transform:rotate(135deg);} 50%{-webkit-transform:rotate(180deg);} 62%{-webkit-transform:rotate(225deg);} 75%{-webkit-transform:rotate(270deg);} 87%{-webkit-transform:rotate(315deg);} 100%{-webkit-transform:rotate(360deg);} } @-moz-keyframes tmsRunning{ 0%{-moz-transform:rotate(0deg);} 12%{-moz-transform:rotate(45deg);} 25%{-moz-transform:rotate(90deg);} 37%{-moz-transform:rotate(135deg);} 50%{-moz-transform:rotate(180deg);} 62%{-moz-transform:rotate(225deg);} 75%{-moz-transform:rotate(270deg);} 87%{-moz-transform:rotate(315deg);} 100%{-moz-transform:rotate(360deg);} } @-o-keyframes tmsRunning{ 0%{-o-transform:rotate(0deg);} 12%{-o-transform:rotate(45deg);} 25%{-o-transform:rotate(90deg);} 37%{-o-transform:rotate(135deg);} 50%{-o-transform:rotate(180deg);} 62%{-o-transform:rotate(225deg);} 75%{-o-transform:rotate(270deg);} 87%{-o-transform:rotate(315deg);} 100%{-o-transform:rotate(360deg);} } .btn.tms-lock-running { position: relative; } .btn.tms-lock-running .indicator::after { content: ""; position: absolute; left: 50%; top: 4px; bottom: 4px; width: 4px; margin-left: -2px; background: #333; } .btn.tms-lock-running .indicator { position: absolute; left: 50%; top: 50%; margin-left: -1em; margin-top: -1em; border-radius: 1em; width: 2em; height: 2em; border: 2px solid #333; background: #fff; animation: tmsRunning 1s infinite; -webkit-animation: tmsRunning 1s infinite; -moz-animation: tmsRunning 1s infinite; -o-animation: tmsRunning 1s infinite; }
3、給需要鎖定的元素添加屬性
示例
其他仍在考慮的問題:1、是否允許用戶主動解除頁面鎖定狀態(tài)?2、是否需要對硬的頁面導(dǎo)航操作,例如:后退,進行控制?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78539.html
摘要:通過管理組件通信通過驅(qū)動視圖比較差異進行更新操作作者第七頁鏈接來源知乎著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。達到無刷新的效果。對象的狀態(tài)不受外界影響。對象代表一個異步操作,有三種狀態(tài)進行中已完成,又稱和已失敗。 以下問題解釋非本人原創(chuàng),是根據(jù)面試經(jīng)驗整理后覺得更容易理解的解釋版本,歡迎補充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發(fā)生了什么 計算機...
摘要:通過管理組件通信通過驅(qū)動視圖比較差異進行更新操作作者第七頁鏈接來源知乎著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。達到無刷新的效果。對象的狀態(tài)不受外界影響。對象代表一個異步操作,有三種狀態(tài)進行中已完成,又稱和已失敗。 以下問題解釋非本人原創(chuàng),是根據(jù)面試經(jīng)驗整理后覺得更容易理解的解釋版本,歡迎補充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發(fā)生了什么 計算機...
摘要:通過管理組件通信通過驅(qū)動視圖比較差異進行更新操作作者第七頁鏈接來源知乎著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。達到無刷新的效果。對象的狀態(tài)不受外界影響。對象代表一個異步操作,有三種狀態(tài)進行中已完成,又稱和已失敗。 以下問題解釋非本人原創(chuàng),是根據(jù)面試經(jīng)驗整理后覺得更容易理解的解釋版本,歡迎補充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發(fā)生了什么 計算機...
摘要:二基于上面的測試,實現(xiàn)頁面加載動畫理想的方式是什么先定好目標盡快讓用戶看到變化,不要讓用戶以為頁面已經(jīng)不響應(yīng),再逐步加載內(nèi)容。頁面上方加載動畫的定義和頁面元素,提供異步加載頁面元素和文件的。 在手機上打開頁面時,經(jīng)常會因為網(wǎng)絡(luò)不好導(dǎo)致需要較長的加載時間,如果這段時間內(nèi)只是顯示一個白板,用戶體驗非常不好。通常的解決方案就是完整打開頁面前給用戶展示一個加載動畫,讓用戶能夠看到頁面還活著呢。...
閱讀 3964·2021-11-11 10:58
閱讀 3339·2021-09-26 09:46
閱讀 1918·2019-08-30 15:55
閱讀 983·2019-08-30 13:52
閱讀 1951·2019-08-29 13:11
閱讀 3031·2019-08-29 11:27
閱讀 1524·2019-08-26 18:18
閱讀 2634·2019-08-23 14:17