成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

移動(dòng)端監(jiān)聽(tīng)安卓手機(jī)返回鍵

DesGemini / 3693人閱讀

摘要:場(chǎng)景相信大家用安卓手機(jī)使用的過(guò)程中,會(huì)遇到這樣的一個(gè)場(chǎng)景按下手機(jī)的返回鍵時(shí),會(huì)彈出一個(gè)詢問(wèn)框是否退出該頁(yè)面然后點(diǎn)擊了確認(rèn)鍵才真正退出。主要需求安卓手機(jī)用戶按下返回鍵不后退網(wǎng)頁(yè)。

【場(chǎng)景】

相信大家用安卓手機(jī)使用APP的過(guò)程中,會(huì)遇到這樣的一個(gè)場(chǎng)景:按下手機(jī)的返回鍵時(shí),會(huì)彈出一個(gè)詢問(wèn)框:"是否退出該頁(yè)面/APP?",然后點(diǎn)擊了確認(rèn)鍵才真正退出APP。PC端目前可以通過(guò)頁(yè)面的轉(zhuǎn)場(chǎng)實(shí)現(xiàn)。那這樣的效果在H5/微信瀏覽器/移動(dòng)端瀏覽器,能否實(shí)現(xiàn)呢?

ps:現(xiàn)在好像很少看到彈出框了,而是彈出一個(gè)toast,然后需要在有效時(shí)間內(nèi)再次點(diǎn)擊才算退出。這個(gè)功能其實(shí)應(yīng)該也可以實(shí)現(xiàn)。

【主要需求】

1.安卓手機(jī)用戶按下返回鍵不后退網(wǎng)頁(yè)。彈出詢問(wèn)框

2.當(dāng)用戶點(diǎn)擊“確定”按鈕,才算后退

【思路】

以上的需求,按我的理解就是一句話:“監(jiān)聽(tīng)安卓手機(jī)返回鍵”,通過(guò)百度/google,雖然發(fā)現(xiàn)此功能仍沒(méi)有很好的解決方案,但是看到了兩個(gè)與此相關(guān)的線索: history pushSate/replaceSate 和 onpopstate 。 大家也可以看看張?chǎng)涡翊笊竦奈恼拢簜魉烷T(mén)。

這兩個(gè)API的作用簡(jiǎn)單來(lái)說(shuō)就是前者可以在瀏覽器地址欄上添加/替換一條記錄,當(dāng)瀏覽器發(fā)生后退動(dòng)作時(shí),觸發(fā)后者api.

(function(){
                if(window.location.hash==""){
                history.pushState(null,null,"#1")//一訪問(wèn)頁(yè)面即添加一條記錄b.html -> b.html#1
            }
            window.onpopstate = function(event) {//當(dāng)用戶按下返回鍵,b.html#1 -> b.html,并觸發(fā)該事件
                if(confirm("確定要退出嗎")){
                    history.back()   //執(zhí)行真正的退出
                }else{
                  history.pushState(null,null,"#1") //用戶取消,恢復(fù)   b.html -> b.html#1
                }
           };
        }    
        )();
【改進(jìn)】

一切看上去很美好,看似把功能實(shí)現(xiàn)了,但是,細(xì)心的用戶就會(huì)發(fā)現(xiàn),當(dāng)按下返回鍵,彈出詢問(wèn)框時(shí),我們既不按確認(rèn),也不按取消,直接再次按下返回鍵,頁(yè)面仍然跳轉(zhuǎn)。因此我們需要改進(jìn)代碼。

    (function(){
            if(window.location.hash==""){
                history.pushState(null,null,"#1")//一訪問(wèn)頁(yè)面即添加一條記錄b.html -> b.html#1
            }
            
            window.onpopstate = function(event) {//當(dāng)用戶按下返回鍵,b.html#1 -> b.html,并觸發(fā)該事件
                history.pushState(null,null,"#1")
                if(confirm("確定要退出嗎")){
                    history.go(-2)   //執(zhí)行真正的退出
                }else{
                                 //用戶取消,恢復(fù)   b.html -> b.html#1
                }
           };
        }    
        )();

如上,我們每次的后退,都假定用戶都按了取消鍵,這樣問(wèn)題就解決了。

測(cè)試后沒(méi)問(wèn)題。但這仍然不是完美的方案,例如在微信瀏覽器,confirm的次數(shù)一旦超過(guò)三次,就要強(qiáng)制退出,無(wú)法取消,或者通常我們開(kāi)發(fā)時(shí)都用到第三方的UI庫(kù)的彈框而不用原生的彈框.....所以下面給出了用mui的框架實(shí)現(xiàn)以上功能。

  if (window.location.hash == "") {
        history.pushState("change", "", "#pageone");
        state = "change"
    } 

    window.onpopstate = function (e) {
      

            if (state == "confirm") {
                history.pushState("change", "", "#pageone");
                state = "change";
                mui.closePopup();
                return;
            }
            history.pushState("confirm", "", "#pageone");
            state = "confirm";
            mui.confirm("是否退出編輯?", "", ["否", "是"], function (e) {
                if (e.index == 0) {
                    history.replaceState("change", "", "#pageone");
                    state = "change";
                 
                }
                else {
                    history.go(-2)
                }

            }, "div");
       
         }
        
【總結(jié)】

由于此api的兼容性極其低,因此不建議大家廣泛使用,學(xué)習(xí)交流還是可以的哈哈,針對(duì)監(jiān)聽(tīng)返回鍵,大家有更好的解決方案,也可以分享一下。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94482.html

相關(guān)文章

  • 使用h5新特性,輕松監(jiān)聽(tīng)任何App自帶返回

    摘要:前言如今新特性新標(biāo)簽新規(guī)范等有很多,而且正在不斷完善中,各大瀏覽器商對(duì)它們的支持,也是相當(dāng)給力。接下來(lái)我將和各位分享一個(gè)特別好用的新特性目前也不是特別新,輕松監(jiān)聽(tīng)任何自帶的返回鍵,包括安卓機(jī)里的物理返回鍵,從而實(shí)現(xiàn)項(xiàng)目開(kāi)發(fā)中進(jìn)一步的需求。 1、前言 如今h5新特性、新標(biāo)簽、新規(guī)范等有很多,而且正在不斷完善中,各大瀏覽器商對(duì)它們的支持,也是相當(dāng)給力。作為前端程序員,我覺(jué)得我們還是有必要積...

    paney129 評(píng)論0 收藏0
  • 使用h5新特性,輕松監(jiān)聽(tīng)任何App自帶返回

    摘要:前言如今新特性新標(biāo)簽新規(guī)范等有很多,而且正在不斷完善中,各大瀏覽器商對(duì)它們的支持,也是相當(dāng)給力。接下來(lái)我將和各位分享一個(gè)特別好用的新特性目前也不是特別新,輕松監(jiān)聽(tīng)任何自帶的返回鍵,包括安卓機(jī)里的物理返回鍵,從而實(shí)現(xiàn)項(xiàng)目開(kāi)發(fā)中進(jìn)一步的需求。 1、前言 如今h5新特性、新標(biāo)簽、新規(guī)范等有很多,而且正在不斷完善中,各大瀏覽器商對(duì)它們的支持,也是相當(dāng)給力。作為前端程序員,我覺(jué)得我們還是有必要積...

    MoAir 評(píng)論0 收藏0
  • 虛擬盤(pán),移動(dòng)web開(kāi)發(fā)的痛

    摘要:原生的彈出虛擬鍵盤(pán)和收回虛擬鍵盤(pán),輸入框始終貼在虛擬鍵盤(pán)的上方。進(jìn)入正題,怎么才能解決這些問(wèn)題呢我們可以先從虛擬鍵盤(pán)入手,看看是否可以監(jiān)聽(tīng)到呼出鍵盤(pán)收回鍵盤(pán)這兩個(gè)事件。部分瀏覽器可以通過(guò)捕捉事件知道是否呼出收起虛擬鍵盤(pán)。 原生APP的彈出虛擬鍵盤(pán)和收回虛擬鍵盤(pán),輸入框始終貼在虛擬鍵盤(pán)的上方。如下圖: showImg(https://segmentfault.com/img/remote...

    kbyyd24 評(píng)論0 收藏0
  • 虛擬盤(pán),移動(dòng)web開(kāi)發(fā)的痛

    摘要:原生的彈出虛擬鍵盤(pán)和收回虛擬鍵盤(pán),輸入框始終貼在虛擬鍵盤(pán)的上方。進(jìn)入正題,怎么才能解決這些問(wèn)題呢我們可以先從虛擬鍵盤(pán)入手,看看是否可以監(jiān)聽(tīng)到呼出鍵盤(pán)收回鍵盤(pán)這兩個(gè)事件。部分瀏覽器可以通過(guò)捕捉事件知道是否呼出收起虛擬鍵盤(pán)。 原生APP的彈出虛擬鍵盤(pán)和收回虛擬鍵盤(pán),輸入框始終貼在虛擬鍵盤(pán)的上方。如下圖: showImg(https://segmentfault.com/img/remote...

    gotham 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<