記微信網(wǎng)頁開發(fā)單頁面返回不刷新的實現(xiàn)

需求

在微信網(wǎng)頁開發(fā)中,點擊返回按鈕不刷新頁面,進行頁面切換,且實現(xiàn)'傳值'功能.

問題由來

在做微信網(wǎng)頁開發(fā)時,由于微信的左上角返回按鈕會返回上一個頁面并且刷新,無法做成打開頁面選擇內(nèi)容后關閉當前頁面,并且給前一個頁面?zhèn)髦档墓δ?

實現(xiàn)方法

想實現(xiàn)此功能一開始想到的是不進行頁面跳轉(zhuǎn)了,把選擇內(nèi)容的頁面也做在當前頁面里,然后使用js來控制顯隱.

登記頁面
// 點擊修改學校按鈕
document.querySelector('.em-school-right').addEventListener('tap', function() {
    document.querySelector('.em-sign').classList.add('mui-hidden');
    document.querySelector('.em-address').classList.remove('mui-hidden');
})
選擇頁面

在微信實際頁面中,由于整頁顯示,用戶會點擊到左上角返回按鈕,會造成關閉頁面.

需要對返回按鈕進行一些操作來修改返回后的效果.

pushState

history提供了一個方法pushState,可以手動的添加頁面進棧。

使用語法:

history.pushState(state, title, url);
state:Object,與要跳轉(zhuǎn)到的URL對應的狀態(tài)信息。
title:頁面名字,方便調(diào)試。
url:要跳轉(zhuǎn)到的URL地址,不能跨域,對于單頁應用來說沒用,傳空即可。

修改點擊事件

// 點擊修改學校按鈕
document.querySelector('.em-school-right').addEventListener('tap', function() {
    document.querySelector('.em-sign').classList.add('mui-hidden');
    document.querySelector('.em-address').classList.remove('mui-hidden');
    // 歷史記錄中插入一條記錄,防止微信返回按鈕會關閉頁面
    var state = {
        title: "選擇學校",
        url: "#school" // 這個url可以隨便填,只是為了不讓瀏覽器顯示的url地址發(fā)生變化,對頁面其實無影響
    };
    window.history.pushState(state, state.title, state.url);
})

onpopstate

history.go和history.back(包括用戶按瀏覽器歷史前進后退按鈕)觸發(fā),并且頁面無刷的時候(由于使用pushState修改了history)會觸發(fā)popstate事件,事件發(fā)生時瀏覽器會從history中取出URL和對應的state對象替換當前的URL和history.state

對返回按鈕添加監(jiān)聽

// 添加微信返回\前進事件監(jiān)聽
window.addEventListener("popstate", function(e) {
    // 選擇地址頁面隱藏
    document.querySelector('.em-address').classList.add('mui-hidden');
    // 簽到頁面顯示
    document.querySelector('.em-sign').classList.remove('mui-hidden');
}, false);

此時進入選擇地址頁面后,點擊返回按鈕,能實現(xiàn)頁面切換


頁面切換

選擇學校后也要實現(xiàn)該操作,用 history.go(-1);實現(xiàn)手動去除歷史記錄中添加的記錄

// 選擇學校
mui('#choose-school').on('tap', 'li', function() {
    var schoolName = this.querySelector('.em-left-name').innerText;
    var schoolAddress = this.querySelector('.em-left-address').innerText;
    document.querySelector('.em-left-name').innerText = schoolName;
    document.querySelector('.em-left-address').innerText = schoolAddress;

    // 手動去除歷史記錄中插入的記錄
    history.go(-1);
    // 選擇地址頁面隱藏
    document.querySelector('.em-address').classList.add('mui-hidden');
    // 簽到頁面顯示
    document.querySelector('.em-sign').classList.remove('mui-hidden');
})
選擇學校

修改完善代碼,實現(xiàn)后退,前進功能

/**
 * @description 初始化監(jiān)聽
 */
initListeners: function() {
    var self = this;

    // 添加微信返回\前進事件監(jiān)聽
    window.addEventListener("popstate", function(e) {
    //處于選擇學校頁面
    if(self.chooseSchool) {
        // 選擇地址頁面隱藏
        document.querySelector('.em-address').classList.add('mui-hidden');
        // 簽到頁面顯示
        document.querySelector('.em-sign').classList.remove('mui-hidden');
    }
    
    // 頁面前進后如果為選擇學校頁面
    if(/#school/.test(window.location.href)){
        self.chooseSchool = true;
        document.querySelector('.em-sign').classList.add('mui-hidden');
        document.querySelector('.em-address').classList.remove('mui-hidden');
    }

}, false);


// 點擊修改學校按鈕
document.querySelector('.em-school-right').addEventListener('tap', function() {
    self.chooseSchool = true;
    document.querySelector('.em-sign').classList.add('mui-hidden');
    document.querySelector('.em-address').classList.remove('mui-hidden');

    // 歷史記錄中插入一條記錄,防止微信返回按鈕會關閉頁面
    var state = {
        title: "選擇學校",
        url: "#school" // 這個url可以隨便填,只是為了不讓瀏覽器顯示的url地址發(fā)生變化,對頁面其實無影響
    };
    window.history.pushState(state, state.title, state.url);
})

// 選擇學校
mui('#choose-school').on('tap', 'li', function() {
    self.chooseSchool = false;
    var schoolName = this.querySelector('.em-left-name').innerText;
    var schoolAddress = this.querySelector('.em-left-address').innerText;
    document.querySelector('.em-left-name').innerText = schoolName;
    document.querySelector('.em-left-address').innerText = schoolAddress;

    // 手動去除歷史記錄中插入的記錄
    history.go(-1);
    // 選擇地址頁面隱藏
    document.querySelector('.em-address').classList.add('mui-hidden');
    // 簽到頁面顯示
    document.querySelector('.em-sign').classList.remove('mui-hidden');
})
}

實現(xiàn)效果

e5dcca61d7_clip.gif

感覺通過這些操作實現(xiàn)了簡單的頁面路由的功能,適用于不是特別復雜的頁面切換選擇

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,410評論 4 61
  • 小離有段時間在朋友圈消失了,很少有她的信息。這樣的她讓我摸不著頭腦,看似很平靜卻讓我感到恐懼!我揣測著她是怎么了?...
    落花小離閱讀 201評論 0 0
  • 一、會計從業(yè)資格證 (一)報考條件 高中或中專以上學歷 (二)報名時間和地點: 一年安排多次考試(各省自己定),到...
    加油沖哇閱讀 364評論 0 4
  • 我還愛他只是不再渴望在一起。 很多時候在路上走著猛一抬頭看到那個人好像你,轉(zhuǎn)念一想,你不在我的學校。 我不喜歡異地...
    yi朵閱讀 340評論 0 1

友情鏈接更多精彩內(nèi)容