ホームページ > 記事 > ウェブフロントエンド > JS はブラウザ ページが更新されたか閉じられたかを区別します_javascript スキル
Web 開発者は、システム開発中にプロダクト マネージャーからさまざまな要求に直面することがよくあります。もちろん、それらのほとんどは、ページの更新、前後の移動、ラベル付け時のブラウザの終了など、製品エクスペリエンスに役立ちます。ユーザーの誤操作を避けるために、2 番目の確認プロンプト ボックスを表示する必要があります。これは、ブラウザーが提供する BOM イベント メカニズムを使用するだけで解決できます。プロダクトマネージャーの場合、そのような要求だけを提起するのは理解できますが、それだけではありません...
たとえば、プロジェクト開発の 1 つで、プロダクト マネージャーが実装のための「改善計画」を提案しました。
あなたのポップアップ ボックスは醜すぎて、システム全体のスタイルと一致していません。独自のコンポーネント ライブラリでダイアログを使用することはできませんか?とても良い質問です...私が言いたいのは、あなたは立ち上がることができます...
更新タブと閉じるタブに表示されるコピーは同じです。ユーザーがわかりやすくするために、更新プロンプトは XXX であり、SSS プロンプトは閉じるときに表示されます。まあ、ユーザーエクスペリエンスを考えると、これは非常に良いことだと私は言いたいのですが、頑張ってください...実際、ブラウザ自体は、閉じたときと更新したときの処理が異なりますが、カスタマイズされています。一部の部分では異なるコピーライティングを表示できません。もちろん、いくつかのハック方法はありますが、複数のブラウザに適応するのは難しく、タブを閉じたり更新したりする内部実装メカニズムはブラウザごとに異なります。
ログインするたびに、エージェントが電話システム (当社はカスタマー サービス システムです) にログインするまでに 10 秒も待たなければならないのはなぜですか?この制限を解除してもらえませんか? ユーザー エクスペリエンスが悪すぎます。これも削除したいのですが、電話システムのチェックインとチェックアウトが頻繁に行われると、ユーザーがブラウザを更新して再度チェックインすると、その間隔が非常に短いと電話システムが誤動作してしまいます。この問題を回避するために、「この制限は克服されましたが、もう一度考えてみると、今日説明するトピックに入ることができます。」を追加しました。
タブの更新と閉じるを区別する
ブラウザのイベントに基づいてタブを更新するか閉じるかを区別することはできず、対応するアクションがトリガーされる前に別のアクションを実行します。ただし、上記の製品で挙げられた 3 番目の点については、実際に最適化することを検討できます。更新時に 10 秒の遅延が発生します。タブを閉じた後、一定時間後にログインまたは再入力する場合には遅延はありません。これを行うのは実際には非常に簡単です。Cookie や LocalStorage などのブラウザのローカル ストレージ メカニズムを使用できます。このセッションが終了するとキャッシュが無効になるため、SessionStorage は使用できません。 Cookie のバイト数を増やすと、各リクエストの対応するネットワーク送信量が増加します。そのため、使用するフロントエンド フレームワークは次のように AngularJS です。
const MAX_WAIT_TIME = 10; const currentDate = new Date().getTime(); const lastestLeaveTime = parseInt(this.$window.localStorage.getItem('lastestLeaveTime'), 10) || currentDate; this.secondCounter = Math.max(MAX_WAIT_TIME - Math.ceil((currentDate - lastestLeaveTime) / 1000), 0); if (this.secondCounter > 0) { this.logoutTimeInterval = this.$interval(()=> { this.secondCounter--; this.$scope.$digest(); }, 1000, this.secondCounter, false).then(() => { this.updateByStatus(this.AvayaService.status.OFFLINE); }); } else { this.updateByStatus(this.AvayaService.status.OFFLINE); }
//刷新页面或者关闭页面 $window.onbeforeunload = () => { return '操作将会导致页面数据清空,请谨慎操作...'; }; //每次页面unload时,设置LocalStorage时间; $window.onunload = () => { $window.localStorage.setItem('lastestLeaveTime', new Date().getTime()); };
onStatusClick(index, name) { if (name === '退出') { this.mgDialog.openConfirm({ showClose: false, template: 'app/header/logoutDialog.html', controller: 'HeaderDialogController as dialog', data: { 'title': '您确定要退出系统吗?' } }).then(() => { this.$window.location.href = '/logout'; this.$window.onbeforeunload = null; }); } else { // 内部操作,大家不用管 ... } }