成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何讓用戶(hù)選擇是否離開(kāi)當(dāng)前頁(yè)面?

開(kāi)發(fā) 前端
如果用戶(hù)填寫(xiě)了很多數(shù)據(jù)此時(shí),不小心點(diǎn)了其他a標(biāo)簽或者關(guān)閉了瀏覽器,不做判斷,那么用戶(hù)數(shù)據(jù)直接丟了。

為什么要讓用戶(hù)選擇是否離開(kāi)頁(yè)面

  •  如果用戶(hù)填寫(xiě)了很多數(shù)據(jù)此時(shí)
  •  不小心點(diǎn)了其他a標(biāo)簽或者關(guān)閉了瀏覽器,不做判斷,那么用戶(hù)數(shù)據(jù)直接丟了

梳理需求

  •  離開(kāi)頁(yè)面方式,被location.href,a標(biāo)簽,關(guān)閉瀏覽器或者當(dāng)前tab頁(yè)等...
  •  需要判斷數(shù)據(jù)是否跟初始化時(shí)一致(用戶(hù)有無(wú)填寫(xiě)表單...)
  •  用戶(hù)選擇離開(kāi)就要繼續(xù)邏輯,反之則不離開(kāi)

正式開(kāi)始

  •     首先要知道一個(gè)事件:onbeforeunload,MDN的說(shuō)明是:當(dāng)瀏覽器窗口關(guān)閉或者刷新時(shí),會(huì)觸發(fā)beforeunload事件。當(dāng)前頁(yè)面不會(huì)直接關(guān)閉,可以點(diǎn)擊確定按鈕關(guān)閉或刷新,也可以取消關(guān)閉或刷新。
  •    HTML規(guī)范指出在此事件中調(diào)用window.alert(),window.confirm()以及window.prompt()方法,可能會(huì)失效

實(shí)踐一下

  •  在微信公眾號(hào)編輯器界面,輸入一部分內(nèi)容后,點(diǎn)擊關(guān)閉tab頁(yè),此時(shí)出現(xiàn)彈窗   

  • 刪除所有內(nèi)容后,回歸初始進(jìn)入的數(shù)據(jù),點(diǎn)擊關(guān)閉tab頁(yè),直接就關(guān)閉了,沒(méi)有出現(xiàn)提示   

  • 看插件顯示,這個(gè)編輯器界面沒(méi)有使用react和vue,應(yīng)該是jq吧,測(cè)試下控制臺(tái),對(duì)的,一猜就中(小編太🐂了,不點(diǎn)個(gè)關(guān)注?)

回到項(xiàng)目中,加入beforeunload事件

  •  HTML文件中加入script標(biāo)簽 
  1. <script type="text/javascript">  
  2.        window.onbeforeunload = function () {  
  3.            return "Leave this page?";  
  4.        }  
  5.    </script> 
  •     點(diǎn)擊關(guān)閉,或者此時(shí)輸入window.location.href= "xxx.ooo.com"會(huì)出現(xiàn)

  •  那么問(wèn)題來(lái)了,如果我通過(guò)a標(biāo)簽跳轉(zhuǎn)呢?

通過(guò)a標(biāo)簽跳轉(zhuǎn)(+前端路由)

  •  我使用的是dva/router,引入相關(guān)組件 
  1. import { Prompt } from 'dva/router';  
  2. ....  
  3. render(){  
  4.   return <Prompt message={this.handlePrompt} />  
  •  引入Prompt組件,并且傳入message是一個(gè)方法,看看這個(gè)方法   
  1. public handlePrompt = (location: Location) => {  
  2.        return false;  
  3.    }; 
  •  那么此時(shí)我們使用dva/router的history.push方法去跳轉(zhuǎn)前端路由,就不能跳了,因?yàn)閔andlePrompt一直返回false,除非返回ture,否則這個(gè)頁(yè)面通過(guò)a標(biāo)簽就無(wú)法跳轉(zhuǎn)了...   

  • 此時(shí)無(wú)論怎么點(diǎn)擊一鍵開(kāi)啟都不會(huì)有效果,那么改成return true試試 
  1. public handlePrompt = (location: Location) => {  
  2.       return true;  
  3.   }; 
  •  一跳就過(guò)去了

問(wèn)題來(lái)了,怎么判斷是否需要跳轉(zhuǎn)呢?

  •  參考微信公眾號(hào)編輯器,如果你編輯了內(nèi)容后(跟初始進(jìn)入的數(shù)據(jù)不一致),而且你是通過(guò)頁(yè)面內(nèi)a標(biāo)簽跳轉(zhuǎn)的,那么就出現(xiàn)彈窗確認(rèn))

  •  那么很簡(jiǎn)單,我們使用antd的Modal組件,以及l(fā)odash的deepclone(深拷貝)、_.isEqual(value, other)執(zhí)行深比較來(lái)確定兩者的值是否相等。

    ❝    注意: isEqual這個(gè)方法支持比較 arrays, array buffers, booleans, date objects, error objects, maps, numbers, Object objects, regexes, sets, strings, symbols, 以及 typed arrays. Object 對(duì)象值比較自身的屬性,不包括繼承的和可枚舉的屬性。不支持函數(shù)和DOM節(jié)點(diǎn)比較。    ❞

實(shí)現(xiàn)思路講解

  •  組件初始化時(shí)候,深拷貝一份表單數(shù)據(jù)存入組件中
  •  當(dāng)用戶(hù)通過(guò)a標(biāo)簽離開(kāi)頁(yè)面時(shí),觸發(fā)handlePrompt方法,存儲(chǔ)離開(kāi)的目的url,此時(shí)使用isEqual比較當(dāng)前的數(shù)據(jù)和組件初始化的表單數(shù)據(jù)是否一致,如果不一致則出現(xiàn)彈窗,讓用戶(hù)選擇是否離開(kāi)
  •  代碼實(shí)現(xiàn): 
  1. // 處理自定義離開(kāi)彈窗  
  2.   handlePrompt =(location )=> 
  3.     // 如果當(dāng)前的保存為false,則彈窗提醒用戶(hù)進(jìn)行保存操作  
  4.     if (!this.isSave) {  
  5.       this.showModalSave(location);  
  6.       return false;  
  7.     }  
  8.     return true;  
  9.   }  
  10.   // 展示離開(kāi)的提示的彈窗  
  11.   showModalSave = location => {  
  12.     this.setState({  
  13.       modalVisible: true,  
  14.       location,  
  15.     });  
  16.   } 
  17.    // 點(diǎn)擊確認(rèn),進(jìn)行頁(yè)面保存操作,和保存成功后路由的跳轉(zhuǎn)  
  18.   handleSaveAuto = () => {  
  19.     const { location } = this.state;  
  20.     const { history } = this.props;  
  21.     this.isSave = true 
  22.     this.setState({  
  23.       modalVisible: false,  
  24.     });  
  25.     //進(jìn)行保存操作的處理,這里可以換成自己點(diǎn)擊確認(rèn)后需要做的操作  
  26.     this.handleSavePaper('save','exit',location.pathname)  
  27.   } 
  •  離開(kāi)邏輯 
  1. // 取消是的路由跳轉(zhuǎn)  
  2.   gotoNewUrl(url){  
  3.     const {dispatch,history } = this.props  
  4.     dispatch(routerRedux.push({  
  5.       pathname:url,  
  6.     }));  
  7.   }  
  8.   // 點(diǎn)擊取消關(guān)閉彈窗  
  9.   closeModalSave=()=> 
  10.     const { location } = this.state;  
  11.     const {dispatch,history } = this.props  
  12.     this.isSave = true 
  13.     this.setState({  
  14.       modalVisible: false,  
  15.     },()=> 
  16.       this.gotoNewUrl(location.pathname)  
  17.     });  
  18.   } 
  •  html結(jié)構(gòu) 
  1. <Prompt message={this.handlePrompt}/>  
  2. <Modal  
  3.     title="溫馨提示"  
  4.     visible={this.state.modalVisible}  
  5.     closable={false}  
  6.     centered  
  7.     onCancel={this.closeModalSave}  
  8.     footer={null}  
  9. >  
  10.   <p>即將離開(kāi)當(dāng)前頁(yè)面,是否保存當(dāng)前修改?</p> 
  11.   <div style={{textAlign:'right'}}>  
  12.     <Button type='primary' onClick={this.handleSaveAuto}>保存</Button>  
  13.     <Button style={{marginLeft:'20px'}} onClick={this.closeModalSave}>取消</Button>  
  14.   </div>  
  15. </Modal> 

 

責(zé)任編輯:龐桂玉 來(lái)源: 前端大全
相關(guān)推薦

2013-04-17 10:54:18

Windows PhoWindows Pho

2022-07-03 17:55:53

HTTP頁(yè)面瀏覽器

2009-12-04 13:14:19

PHP Global變

2023-04-26 08:18:48

FormPrompt表單更改

2021-04-06 11:07:02

字節(jié)跳動(dòng)組織架構(gòu)

2013-07-12 13:24:19

App誘惑

2015-06-30 09:44:41

公有云游戲游戲云

2020-04-20 14:50:02

前端技巧優(yōu)化

2019-03-25 08:30:20

騰訊互聯(lián)網(wǎng)

2023-03-08 12:44:00

谷歌AI區(qū)塊鏈

2013-07-05 13:48:47

App

2015-09-02 11:42:27

桌面云深信服

2021-03-15 07:43:17

騰訊工作事業(yè)

2016-03-21 13:24:22

apk安卓開(kāi)發(fā)

2021-05-31 07:18:46

SpringSecurity信息

2009-07-25 12:09:29

Windows網(wǎng)絡(luò)瀏覽器

2022-02-03 23:50:11

Windows 11Windows 10微軟

2009-07-17 13:35:41

微軟操作系統(tǒng)Windows 7升級(jí)方案

2020-07-14 14:40:05

激光噴墨打印

2022-03-24 14:49:57

HTTP前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美三级在线 | 国产一区二区a | 成人小视频在线观看 | 午夜午夜精品一区二区三区文 | 免费毛片www com cn | 少妇精品久久久久久久久久 | 二区在线观看 | 99欧美精品 | 玖玖在线精品 | 欧美一区2区三区4区公司 | 天天插日日操 | 日本在线免费视频 | 日韩欧美国产精品 | 国内精品久久久久 | 国产精品一区二区无线 | 欧美精品在欧美一区二区 | 亚洲午夜精品视频 | 麻豆一区 | 亚洲综合色网站 | 欧美成人视屏 | 爱爱视频日本 | 亚洲精品国产电影 | 国产ts人妖系列高潮 | 91视频在线观看免费 | 手机看片1 | 久久久久久久久久久久亚洲 | 美女午夜影院 | 国产成人99久久亚洲综合精品 | 亚洲一区国产 | 91av免费观看 | 欧美视频1区 | 伊人精品国产 | 欧美精选一区二区 | 一区中文字幕 | 国产精品久久久久久 | 国产午夜精品视频 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 欧美色欧美亚洲另类七区 | 欧美一级毛片免费观看 | 国产精品永久免费 | 中文字幕成人 |