微信公众号WebApp接管返回键实现“再按一次退出程序”功能
2014-07-13 20:25
447 查看
按微信产品部副总经理张颖“每一个公众号都是一个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实现代码如下:
监听popstate事件的代码稍作修改就可以用于任意控制单页应用中javascript生成的任意动态页面的跳转,此方法已经在微信公众号WebApp中使用,可在微信中搜索“myfunds”公众号关注体验。这个方法也可以用于微信公众号之外的WebApp,链接就不发了,免得CSDN又要审查。
有什么方法改变这一点么?最理想的解决办法是微信自己接管用户按物理返回键这个事件,然后类似像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又要审查。
相关文章推荐
- 微信公众号WebApp接管返回键实现“再按一次退出程序”功能
- Android中的“再按一次返回键退出程序”功能实现
- Android“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现
- Android中"再按一次返回键退出程序"的实现(返回桌面)
- Android中的“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现
- ANDROID 实现 再按一次返回键退出程序 代码片段
- 安卓:实现返回键“再按一次退出程序”
- Android中的“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现[转]
- Android 再按一次返回键退出程序实现思路
- 再按一次返回键退出程序的实现
- Android “再按一次返回键退出程序”实现介绍
- Android中“再按一次返回键退出程序”实现
- Android中的“再按一次返回键退出程序”实现