1. 程式人生 > >微信公眾號WebApp接管返回鍵實現“再按一次退出程式”功能

微信公眾號WebApp接管返回鍵實現“再按一次退出程式”功能

  按微信產品部副總經理張穎“每一個公眾號都是一個APP”的說法,我們確實可以利用微信內建瀏覽器訪問為公眾號設計WebApp單頁應用,以使得客戶在訪問公眾號時有近似原生App的體驗,不過目前這樣的公眾號很少,原因除了使用javascript開發單頁應用的難度比開發一般的Web頁面難度更高一些,更重要的一點是使用微信內建瀏覽器訪問Web頁面時,Android使用者一按物理返回鍵就回到微信介面,而Android使用者按物理返回鍵的習慣預期是回到上一頁,這樣就使得微信公眾號的WebApp客戶體驗非常差。

  有什麼方法改變這一點麼?最理想的解決辦法是微信自己接管使用者按物理返回鍵這個事件,然後類似像getNetworkType一樣提供javascript事件給開發者使用。不過很遺憾,騰訊目前沒有提供這個事件,而且看樣子將來也不打算提供。

  這個問題不是大問題,但如果不解決會影響Android使用者的客戶體驗。幸運的是,我找到了解決辦法,方法就是利用javascript window history來解決。

  由於安全原因javascript不允許修改history裡已有的url連結,但可以使用pushState方法往history裡增加url連結,並且提供popstate事件監測從history棧裡彈出url。我們可以利用這一點,在WebApp載入主介面後先往history裡壓入“#”連結,然後監聽popstate事件,在Android手機的瀏覽器,按下物理返回鍵預設的操作是執行window.history.back(),此時將觸發popstate事件。收到popstate事件時程式碼顯示“再按一次退出程式”div頂層標籤,此時history棧已經為空,如使用者再次按下物理返回鍵將執行預設操作回到微信。接著,我們要設定一個定時器,在指定的時間(比如2秒)後如使用者沒有再次按下物理返回鍵將再次往history裡壓入“#”連結,並隱藏“再按一次退出程式”div頂層標籤,等待使用者下一次按下物理返回鍵。

  javascript實現程式碼如下:

pushHistory();
setTimeout(function () {
  window.addEventListener("popstate", function(e) {
    showBox("再按一次退出程式", 2000, function() {        
      pushHistory();
    });
  }, false);
}, 300);

function pushHistory() {
  var state = {
  	title: "title",
  	url: "#"
  };
  window.history.pushState(state, "title", "#");
}

function showBox(msg, timeOut, onTimeOut) {
  if (typeof alertBoxDiv === "undefined") {
    alertBoxDiv = $("<div/>").addClass("alert-box hide").append( $("<div/>").addClass("label label-primary")).appendTo($("body"));
  }
  alertBoxDiv.children(".label").html(msg);
  alertBoxDiv.removeClass("hide");
  if (typeof timeOut === "undefined") timeOut = 2000;
  setTimeout(function() {
    alertBoxDiv.addClass("hide");
    if (typeof onTimeOut !== "undefined") onTimeOut();
  }, timeOut);
}

  監聽popstate事件的程式碼稍作修改就可以用於任意控制單頁應用中javascript生成的任意動態頁面的跳轉,此方法已經在微信公眾號WebApp中使用,可在微信中搜索“myfunds”公眾號關注體驗。這個方法也可以用於微信公眾號之外的WebApp,連結就不發了,免得CSDN又要審查。