History.pushState和遍历历史记录 - PhoneGap / Android

时间:2013-04-16 10:20:53

标签: javascript android cordova cordova-2.0.0 html5-history

我正在为客户编写Android应用程序。我一直在使用自己的框架来创建应用程序。

这个框架在iPhone上没有问题,但是当我将它应用到Android / Phonegap时,我遇到了后退按钮的问题。我的解决方案是调用History对象来创建项目,因为查看了不同的页面。这段代码的要点如下:

        'hook_call': function (name, data, callback, skip_history) {

            if (typeof callback != 'function') {
                callback = function () {};
            }

            app.handlers[name].call(this, data, callback);
            window.app.current_hook = name;

            // Manage history
            if(!skip_history ) {
                history.pushState({'page': name, 'data': data}, null, '#'+name);
            }

        }

我的onpopstate功能:

// Manage history
window.onpopstate = function(event) {
    try {
        if(window.app.current_hook != event.state.page)
            window.app.hook_call(event.state.page, event.state.data);
    }
    catch(e) {}
};

因此,这会正确添加项目。但是,如果我在历史记录中说三个级别(homelistings - > view_listing)并从view_listing按回来,我将被带到listings }部分,这是正确的,但任何进一步的按下都会让我离开listings,它不会再向后移动。

当我在刚刚解释的导航步骤后查看日志时,我看到了这些虚假的项目:

04-16 10:22:39.320: D/CordovaWebView(1148): The current URL is: file:///android_asset/www/index.html#listing
04-16 10:22:39.320: D/CordovaWebView(1148): The URL at item 0 is:file:///android_asset/www/index.html
04-16 10:22:39.400: D/CordovaWebView(1148): The URL at index: 0is file:///android_asset/www/index.html
04-16 10:22:39.400: D/CordovaWebView(1148): The URL at index: 1is file:///android_asset/www/index.html#welcome
04-16 10:22:39.400: D/CordovaWebView(1148): The URL at index: 2is file:///android_asset/www/index.html#listings
04-16 10:22:39.410: D/CordovaWebView(1148): The URL at index: 3is file:///android_asset/www/index.html#listing

我应该添加它来访问不同的页面,例如在点击列表或按下按钮时调用hook_call()

此方案适用于通过应用程序导航的任何其他组合。

有没有人有过这种或类似的经历?

1 个答案:

答案 0 :(得分:3)

我相信你的函数看起来像这样,并设置了skip_history标志:

// Manage history
window.onpopstate = function(event) {
    try {
        if(window.app.current_hook != event.state.page)
            window.app.hook_call(event.state.page, event.state.data, null, true);
    }
    catch(e) {}
};

由于您不想推送历史记录,因此您只需将其弹回堆栈。