在用戶操作網(wǎng)頁(yè)時(shí),我們有時(shí)需要監(jiān)聽(tīng)用戶關(guān)閉或者跳轉(zhuǎn)網(wǎng)頁(yè)的行為,比如像在線編輯工具,如果用戶沒(méi)有提交、保存就關(guān)閉頁(yè)面,那一切更新的數(shù)據(jù)都會(huì)丟失,如何防止這一現(xiàn)象發(fā)生?本文提供了一種解決辦法,但不是很友好,不得已而為之。
關(guān)于頁(yè)面/瀏覽器關(guān)閉事件,onbeforeunload依舊可行,不過(guò)如果使用者禁止了這一事件,那就改換別的辦法吧。
關(guān)于頁(yè)面跳轉(zhuǎn),也就是網(wǎng)址發(fā)生變化,如果要監(jiān)聽(tīng)路由變化,有兩種情況:
- 用ng-route路由,就使用$locationChangeStart事件:
$scope.$on('$locationChangeStart', function( event ) {
var answer = confirm("Are you sure you want to leave this page?")
if (!answer) {
event.preventDefault();
}
});
2.用ui-route路由,就使用$stateChangeStart事件:
$scope.$on('$stateChangeStart', function(event) {
var answer = confirm("確定不保存么?");
if (!answer) {
event.preventDefault();
}
});
**補(bǔ)充:
A: 如何去掉上面兩個(gè)函數(shù)監(jiān)聽(tīng)呢?(比如用戶保存完之后)
1.再寫一個(gè)onbeforeunload事件,事件中什么都不放置,可以讓用戶保存之后觸發(fā)此事件;
2.將$locationChangeStart或者$stateChangeStart事件放在一個(gè)全局變量中,比如vm.stopListener,之后在用戶觸發(fā)的事件中調(diào)用一次vm.stopListener()即可。