鍍金池/ 問答/HTML/ spa架構(gòu)下,移動端modal彈出層在如何返回時自動關(guān)閉

spa架構(gòu)下,移動端modal彈出層在如何返回時自動關(guān)閉

移動端會有很多的彈出層,比如loading,alert,confirm,prompt等等,在spa下用前端路由進行頁面管理的情況,這些彈出層由于是被注入到body元素內(nèi)的,如果按手機的返回鍵,雖然頁面返回了,但這些彈出層還是會存在的。有解決方案嗎?

  1. 我想的是在這些彈出層模塊內(nèi)都監(jiān)聽一下頁面變化,然后隱藏自己。
  2. 第二是每個頁面自己控制本頁面用到的彈出層
回答
編輯回答
陌璃

在路由勾子函數(shù)上,處理這些問題就可以了

2018年8月15日 00:15
編輯回答
命于你

如果你的路由是基于hash的,可以監(jiān)聽hashchange事件,在回調(diào)函數(shù)里手動關(guān)閉所有彈出層。

window.onhashchange = function(e){
    // 關(guān)閉彈出層
}
2018年3月12日 10:13
編輯回答
失魂人

按照交互規(guī)范來講,當模態(tài)彈出層彈出時,點擊手機的后退鍵觸發(fā)的行為應(yīng)該是保守式地關(guān)閉彈出層,即,如果是 alert,則相當于點擊【確定】,如果是 confirm 或 prompt,則相當于點擊【取消】。可以在App中看一下交互是不是這樣的。如果在 SPA 單頁應(yīng)用中實現(xiàn)這樣的效果,需要借助 history API 實現(xiàn),在彈出時 pushState,并且監(jiān)聽 popstate 事件并進行相應(yīng)的關(guān)閉彈出層操作。
后續(xù)我會整理個 Demo 發(fā)出來

2018年2月26日 09:40
編輯回答
乞許

看到你提及了vue,就以vue來說明吧。

首先控制彈出層是否顯示,需要定義個標志位,類型為Boolean。初始情況下為false,當需要用到時,置為true。

對應(yīng)到vue里,就是先在data里定義個flag:false,彈出時設(shè)置flag=true,不用時再flag=false。

這應(yīng)該就是你所說的第二個想法的實現(xiàn)。不用擔心頁面返回了,下次再進來,彈出層依然還顯示著。
具體原因,參考vue的生命周期。

2017年6月27日 20:15
編輯回答
瞄小懶
router.afterEach(() => {
  Vue.prototype.$closeLoading();
  Vue.prototype.$closeModal();
  MessageBox.close();
});

這樣處理就可以了吧?

2018年9月13日 21:31