記微信網頁開發單頁面返回不重新整理的實現

weixin_33766168發表於2018-03-23

需求

在微信網頁開發中,點選返回按鈕不重新整理頁面,進行頁面切換,且實現'傳值'功能.

問題由來

在做微信網頁開發時,由於微信的左上角返回按鈕會返回上一個頁面並且重新整理,無法做成開啟頁面選擇內容後關閉當前頁面,並且給前一個頁面傳值的功能.

實現方法

想實現此功能一開始想到的是不進行頁面跳轉了,把選擇內容的頁面也做在當前頁面裡,然後使用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,與要跳轉到的URL對應的狀態資訊。
title:頁面名字,方便除錯。
url:要跳轉到的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地址發生變化,對頁面其實無影響
    };
    window.history.pushState(state, state.title, state.url);
})

onpopstate

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

對返回按鈕新增監聽

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

此時進入選擇地址頁面後,點選返回按鈕,能實現頁面切換
頁面切換

選擇學校後也要實現該操作,用 history.go(-1);實現手動去除歷史記錄中新增的記錄

// 選擇學校
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');
})

選擇學校

修改完善程式碼,實現後退,前進功能

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

    // 新增微信返回\前進事件監聽
    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地址發生變化,對頁面其實無影響
    };
    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');
})
}

實現效果

e5dcca61d7_clip.gif

感覺通過這些操作實現了簡單的頁面路由的功能,適用於不是特別複雜的頁面切換選擇

相關文章