Vue中對(duì)安卓物理返回鍵的解決方案

本文為純?cè)瓌?chuàng),如需轉(zhuǎn)載陌知,請(qǐng)注明來源。2019年5月31日 09:13:58

說在前面的話

如果你當(dāng)前使用的庫是JQuery掖肋,那請(qǐng)參考我前面的文章<<JavaScript監(jiān)聽安卓物里返回鍵>>
如果是Vue-Cli(不是UMD引入的Vue)仆葡,請(qǐng)繼續(xù)往下看。

當(dāng)我們向控制物理返回鍵(之后簡(jiǎn)稱返回鍵)的時(shí)候志笼,無非是想實(shí)現(xiàn)兩種功能:

1沿盅、 用戶點(diǎn)按返回鍵,不返回到上級(jí)頁面纫溃,且不進(jìn)行任何操作腰涧,達(dá)到禁用返回鍵的目的。
2紊浩、用戶點(diǎn)按返回鍵窖铡,不返回到上級(jí)頁面,但跳轉(zhuǎn)到其它頁面坊谁,或者執(zhí)行其它內(nèi)置方法费彼,達(dá)到改寫返回鍵的目的。

但由于在Vue項(xiàng)目中口芍,控制頁面跳轉(zhuǎn)使用的是Router箍铲,如果直接在public/index.html中添加前文的方法,就會(huì)導(dǎo)致物理返回鍵被絕對(duì)控制鬓椭,無法動(dòng)態(tài)修改的問題颠猴。
而如果把前文的方法寫到App.vue中,再在每個(gè)頁面按需調(diào)用這個(gè)方法小染,則又會(huì)出現(xiàn)事件重復(fù)疊加的bug芙粱。
我也苦惱了好一陣,最后找到了個(gè)人認(rèn)為比較完美的解決方案氧映。

話不多說春畔。

并未直接給出代碼,而是從實(shí)現(xiàn)原理講解岛都。

1. 要實(shí)現(xiàn)前文中的pushHistory()方法

不同于傳統(tǒng)JS的是律姨,當(dāng)我們?cè)赩ue項(xiàng)目中控制頁面跳轉(zhuǎn)時(shí),為了不破壞Vuex中的數(shù)據(jù)臼疫,會(huì)使用this.$router.push() 來代替 window.location.href

而當(dāng)我們按照前文中提到的方法使用后择份,發(fā)現(xiàn)vue生成的地址被完整替換掉了。

如圖:


使用前的地址
控制臺(tái)執(zhí)行前文方法
使用后的地址

可見烫堤,使用前文方法后熔吗,由Router生成的hash被破壞掉了,雖然我未發(fā)現(xiàn)這對(duì)當(dāng)前頁面有什么影響凿滤,但這一定是不可取的。

隨后我修改了這個(gè)方法如下:

function pushHistory(){
        var state = {
          title:"title",
          url:window.location.hash};
        window.history.pushState(state,"title",window.location.hash);
      }
      pushHistory()

并把它添加到了index.html里利诺。
因?yàn)樘砑拥絠ndex.html之后,我的pushHistory()將變成全局可以調(diào)用的方法剩燥,因?yàn)閂ue會(huì)將所有的.vue文件渲染到這個(gè)index.html中慢逾。
我使用 window.location.hash替換掉了#,這樣以保證Router生成的hash不被破壞掉灭红。

注意方法添加的位置

該js代碼添加的位置一定要在head中侣滩,否則根據(jù)執(zhí)行順序,如果寫到了body后面变擒,Vue是調(diào)取不到的君珠。

2. 要有一個(gè)方法,可以在Vue的任何頁面中調(diào)用,以用于攔截window.onpopstate請(qǐng)求娇斑,并且動(dòng)態(tài)執(zhí)行我們要執(zhí)行的方法策添。

要實(shí)現(xiàn)一個(gè)在Vue個(gè)頁面中可以調(diào)用的方法很簡(jiǎn)單,我們只要寫帶main.js中悠菜,再將它掛到原型鏈上即可。
代碼如下:

function gotoURL(callback){
  window.onpopstate = null;
  window.onpopstate = function(){
    callback()
  }
}
Vue.prototype.gotoURL = gotoURL

main.js如圖


image.png

請(qǐng)只看紅框內(nèi)的代碼败富,不要在意別的悔醋。

3、調(diào)用

注意:請(qǐng)不要在App.vue中調(diào)用兽叮,因?yàn)锳pp.vue只是其它頁面的容器芬骄,只會(huì)被一次渲染, 我們?cè)谂渲肦outer的時(shí)候,一般路徑為'/'的頁面會(huì)被直接渲染到App.vue中鹦聪,所以當(dāng)我們要控制初始頁面的返回鍵账阻,需要找到對(duì)應(yīng)的vue文件中調(diào)用方法,而不是在App.vue中調(diào)用方法泽本。

調(diào)用一般為 一個(gè)頁面一次性調(diào)用淘太,意思就是在頁面渲染的時(shí)候,我們就要調(diào)用這個(gè)方法规丽。
所以我要(建議)將調(diào)用的方法寫到mounted周期中蒲牧。如下:

mounted() {
  let that =this;
  pushHistory()  // 必須存在
  that.gotoURL(function () { 
    pushHistory()  // 必須存在
    console.log('666')  // 點(diǎn)擊返回鍵要執(zhí)行的方法
  })
}

為什么要把pushHistory調(diào)用兩次?
我也曾刪掉它們之中的任何一個(gè)赌莺,但是會(huì)出現(xiàn)返回鍵無法正潮溃控制的問題,所以先加上艘狭,后期如果有更好方法挎扰,我會(huì)發(fā)上來翠订。

不要濫用這個(gè)方法,只在需要的頁面中使用遵倦,不需要的頁面中請(qǐng)不要調(diào)用尽超,以防出現(xiàn)問題。

產(chǎn)品設(shè)計(jì)建議: PM在設(shè)計(jì)產(chǎn)品時(shí)骇吭,請(qǐng)要考慮移動(dòng)端的一些問題橙弱,盡量避免硬核控制返回鍵的情況出現(xiàn)。

如果讀者有其它需要燥狰,可以通過我的簡(jiǎn)書首頁簽名下方的微信二維碼添加我好友棘脐,請(qǐng)注明來意。

補(bǔ):

有的朋友問我為什么使用DOM0事件控制popstate而不是DOM2,因?yàn)镈OM2無法解綁匿名函數(shù)龙致,因?yàn)槲以诓煌撁娲M(jìn)來的callback是不一樣的蛀缝。使用DOM2會(huì)出現(xiàn)事件疊加。根據(jù)事件機(jī)制目代,所以使用DOM0屈梁,讓每一次的事件都替換上一次的事件。
而在傳統(tǒng)的JS中為什么可以使用DOM2榛了,是因?yàn)槊恳粋€(gè)頁面都切換了運(yùn)行環(huán)境在讶,所以前一個(gè)頁面的DOM2不會(huì)和當(dāng)前頁面的DOM2相疊加。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霜大,一起剝皮案震驚了整個(gè)濱河市构哺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌战坤,老刑警劉巖曙强,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異途茫,居然都是意外死亡碟嘴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門囊卜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娜扇,“玉大人,你說我怎么就攤上這事栅组「ぶ裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵笑窜,是天一觀的道長致燥。 經(jīng)常有香客問我,道長排截,這世上最難降的妖魔是什么嫌蚤? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任辐益,我火速辦了婚禮,結(jié)果婚禮上脱吱,老公的妹妹穿的比我還像新娘智政。我一直安慰自己,他們只是感情好箱蝠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布续捂。 她就那樣靜靜地躺著,像睡著了一般宦搬。 火紅的嫁衣襯著肌膚如雪牙瓢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天间校,我揣著相機(jī)與錄音矾克,去河邊找鬼。 笑死憔足,一個(gè)胖子當(dāng)著我的面吹牛胁附,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滓彰,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼控妻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了揭绑?” 一聲冷哼從身側(cè)響起弓候,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洗做,沒想到半個(gè)月后弓叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彰居,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诚纸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陈惰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦徘。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抬闯,靈堂內(nèi)的尸體忽然破棺而出井辆,到底是詐尸還是另有隱情,我是刑警寧澤溶握,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布杯缺,位于F島的核電站,受9級(jí)特大地震影響睡榆,放射性物質(zhì)發(fā)生泄漏萍肆。R本人自食惡果不足惜袍榆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塘揣。 院中可真熱鬧包雀,春花似錦、人聲如沸亲铡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奖蔓。三九已至赞草,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锭硼,已是汗流浹背房资。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檀头,地道東北人轰异。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像暑始,于是被迫代替她去往敵國和親搭独。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一:什么是閉包廊镜?閉包的用處牙肝? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上嗤朴,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 9,610評(píng)論 1 52
  • Vue八個(gè)生命周期 beforeCreate【創(chuàng)建前】created【創(chuàng)建后】 beforeMount【載入前】 ...
    艾薩克菊花閱讀 1,314評(píng)論 0 12
  • 你知道嗎雹姊,古人都是唱歌的高手 現(xiàn)代社會(huì)股缸,大家都喜歡聽歌,各種中國好聲音你方唱罷我登場(chǎng)吱雏,樂此不疲敦姻。其實(shí),...
    學(xué)而忘憂閱讀 5,090評(píng)論 0 3
  • 假設(shè)白素貞這個(gè)人穿了的白衣服歧杏,怎樣才能襯托出她衣服白呢镰惦? 那么!只有一個(gè)辦法最好用犬绒,那就是她首先得奇黑無比旺入,這樣有...
    瑩鴿鴿閱讀 181評(píng)論 0 0
  • 下車茵瘾,麻麻問:3加8等于幾喲急膀?你ban一個(gè)來看看啊龄捡? 小朋友開啟的"裝萌"模式卓嫂,對(duì)麻麻說:"可是我...
    小雍豆子姐姐閱讀 915評(píng)論 0 0