您好,登錄后才能下訂單哦!
小編給大家分享一下Html5頁(yè)面中如何實(shí)現(xiàn)返回,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
看到這個(gè)題目你可能覺(jué)得這是什么鬼? 其實(shí)我想說(shuō)的是這種,看下面的錄制:
這種交互在H5頁(yè)面中比比皆是,點(diǎn)擊城市->彈出城市選擇浮層->按返回按鈕關(guān)閉浮層。
這些操作都是不要點(diǎn)擊左上角/右上角的關(guān)閉按鈕就可以進(jìn)行的,飛豬的H5是前進(jìn)出現(xiàn)彈層,返回時(shí)彈層關(guān)閉,其他家都不行(去哪兒網(wǎng)H5飛機(jī)票,美團(tuán)H5酒店)。
為什么要這么設(shè)計(jì)?
因?yàn)镠5是在手機(jī)上操作的,手機(jī)上的手指可操作區(qū)域的覆蓋范圍很小,更別說(shuō)左上角/右上角這些死角(取消/關(guān)閉)區(qū)域了。你肯定聽(tīng)過(guò)這個(gè)操作:輕觸返回。這個(gè)在用戶操作的時(shí)候非常方便友好,選擇完城市后,不需要點(diǎn)擊取消,直接在大拇指可以操作的地方點(diǎn)擊返回就關(guān)閉了彈層。
如何實(shí)現(xiàn)
既然有這種非常好的需求,那作為開(kāi)發(fā)肯定就會(huì)想法設(shè)法的實(shí)現(xiàn)這個(gè)功能了。 你甚至都不用google,你就應(yīng)該會(huì)想到類(lèi)似的history.back(),history.go()這些方法了。 然而想到這些依舊沒(méi)用,理論上 瀏覽器/webview 的返回/前進(jìn)的是要重新加載頁(yè)面的,因?yàn)閁RL發(fā)生了變化。 如果你真的知道單頁(yè)面應(yīng)用(SPA),或者使用React/Vue你就應(yīng)該知道有個(gè)東西叫:路由。 這些通過(guò)改變hash且無(wú)法刷新的url變化是HTML5時(shí)加入的history功能
the-history-interface
interface History { readonly attribute unsigned long length; attribute ScrollRestoration scrollRestoration; readonly attribute any state; void go(optional long delta = 0); void back(); void forward(); void pushState(any data, DOMString title, optional DOMString? url = null); void replaceState(any data, DOMString title, optional DOMString? url = null); };
pushState
replaceState
還有一個(gè)事件
onpopstate
pushState,replaceState 用來(lái)改變histroy堆棧順序,onpopstate 在返回,前進(jìn)的時(shí)候觸發(fā)
vue-router中的實(shí)現(xiàn)也是如此(第1694行)
具體實(shí)現(xiàn)
既然說(shuō)了這么多,那我們來(lái)看下怎么實(shí)現(xiàn)這種功能。
來(lái)看下 pushState 和 replaceState 的兼容性
全綠,用起來(lái)放心多了。
思路:
點(diǎn)擊彈層時(shí) pushState 添加 hash
"輕觸返回"的時(shí)候觸發(fā) onpopstate 事件時(shí)候隱藏彈層并修改 hash
<button onclick="city()"> 城市 </button><br> <button onclick="calendar()"> 日歷 </button><br> <button onclick="description()"> 說(shuō)明 </button> <div id="city" class="com" style="display: none;"> 模擬城市彈框?qū)? </div> <div id="calendar" class="com" style="display: none;"> 模擬日歷彈框?qū)? </div> <div id="description" class="com" style="display: none;"> 模擬說(shuō)明彈框?qū)? </div>
button { border: #0000; background-color: #f90; } .com { position: absolute ; top: 0; bottom: 0; left: 0; right: 0; background-color: #888589; }
var cityNode = document.getElementById('city'); var calendarNode = document.getElementById('calendar'); var descriptionNode = document.getElementById('description'); function city() { cityNode.style.display = 'block'; window.history.pushState({'id':'city'},'','#city') } function calendar() { calendarNode.style.display = 'block'; window.history.pushState({'id':'calendar'},'','#calendar') } function description() { descriptionNode.style.display = 'block'; window.history.pushState({'id':'description'},'','#description') } window.addEventListener('popstate', function(e){ // alert('state:' + e.state + ', historyLength:' + history.length); if (e.state && e.state.id === 'city') { history.replaceState('','','#'); cityNode.style.display = 'block'; } else if (e.state && e.state.id === 'calendar') { history.replaceState('','','#'); calendarNode.style.display = 'block'; } else if (e.state && e.state.id === 'description') { history.replaceState('','','#'); descriptionNode.style.display = 'block'; } else { cityNode.style.display = 'none'; calendarNode.style.display = 'none'; descriptionNode.style.display = 'none'; } })
主要看 JS 代碼,監(jiān)聽(tīng)頁(yè)面的前進(jìn)和后退事件來(lái)控制history。
看完了這篇文章,相信你對(duì)“Html5頁(yè)面中如何實(shí)現(xiàn)返回”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。