摘要:由于網絡等各方面原因,有時執行一個操作時有時需要等待比較長的時間,如果不進行特殊處理就無法知道當前操作的狀態,嚴重影響用戶體驗。為了解決上面的問題,考慮利用的對執行長操作時需要進行控制的元素進行設置,實現以元素為單位進行頁面狀態的控制。
由于網絡等各方面原因,有時執行一個ajax操作時有時需要等待比較長的時間,如果不進行特殊處理就無法知道當前操作的狀態,嚴重影響用戶體驗。
比較常見的解決方案是執行可能的長操作前先打開一個蒙版,覆蓋頁面,通過動畫指示當前頁面處于執行狀態,獲得返回結果后在關閉蒙版。這種方式雖然可以很清晰的展現正在等待操作結果的狀態,但是對于網絡條件比較好,操作結果很快就返回的情況,會給用戶造成一種頁面閃爍的感覺,也會影響用戶體驗。
為了解決上面的問題,考慮利用angular的directive對執行長操作時需要進行控制的元素進行設置,實現以元素為單位進行頁面狀態的控制。
需要進行狀態控制的元素有幾類:1、input元素,執行長操作時它們應該處于disabled狀態;2、button等發起操作的元素,它們應該出于disabled的狀態,同時發起正在執行的長操作的元素應該出于running的狀態,例如:通過動畫。
實現思路如下:
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、設置運行狀態的樣式
@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、是否允許用戶主動解除頁面鎖定狀態?2、是否需要對硬的頁面導航操作,例如:后退,進行控制?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78539.html
摘要:通過管理組件通信通過驅動視圖比較差異進行更新操作作者第七頁鏈接來源知乎著作權歸作者所有,轉載請聯系作者獲得授權。達到無刷新的效果。對象的狀態不受外界影響。對象代表一個異步操作,有三種狀態進行中已完成,又稱和已失敗。 以下問題解釋非本人原創,是根據面試經驗整理后覺得更容易理解的解釋版本,歡迎補充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發生了什么 計算機...
摘要:通過管理組件通信通過驅動視圖比較差異進行更新操作作者第七頁鏈接來源知乎著作權歸作者所有,轉載請聯系作者獲得授權。達到無刷新的效果。對象的狀態不受外界影響。對象代表一個異步操作,有三種狀態進行中已完成,又稱和已失敗。 以下問題解釋非本人原創,是根據面試經驗整理后覺得更容易理解的解釋版本,歡迎補充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發生了什么 計算機...
摘要:通過管理組件通信通過驅動視圖比較差異進行更新操作作者第七頁鏈接來源知乎著作權歸作者所有,轉載請聯系作者獲得授權。達到無刷新的效果。對象的狀態不受外界影響。對象代表一個異步操作,有三種狀態進行中已完成,又稱和已失敗。 以下問題解釋非本人原創,是根據面試經驗整理后覺得更容易理解的解釋版本,歡迎補充。 一. 輸入url后的加載過程 從輸入 URL 到頁面加載完成的過程中都發生了什么 計算機...
摘要:二基于上面的測試,實現頁面加載動畫理想的方式是什么先定好目標盡快讓用戶看到變化,不要讓用戶以為頁面已經不響應,再逐步加載內容。頁面上方加載動畫的定義和頁面元素,提供異步加載頁面元素和文件的。 在手機上打開頁面時,經常會因為網絡不好導致需要較長的加載時間,如果這段時間內只是顯示一個白板,用戶體驗非常不好。通常的解決方案就是完整打開頁面前給用戶展示一個加載動畫,讓用戶能夠看到頁面還活著呢。...
閱讀 3952·2021-11-11 10:58
閱讀 3321·2021-09-26 09:46
閱讀 1912·2019-08-30 15:55
閱讀 976·2019-08-30 13:52
閱讀 1944·2019-08-29 13:11
閱讀 3024·2019-08-29 11:27
閱讀 1517·2019-08-26 18:18
閱讀 2618·2019-08-23 14:17