history.back在使用Cordova的iOS上不起作用

时间:2014-06-22 15:28:31

标签: javascript jquery ios cordova html5-history

我有一个与Cordova一起开发的混合应用程序。该应用程序非常简单,所以我还没有使用过框架。几乎所有页面都是使用jQuery的ajax()方法通过Ajax注入的,然后通过pushState()方法使用HTML5 History API添加到历史记录中。

为了让用户返回之前访问过的页面(历史记录中的页面),我创建了一个按钮。我监听backbutton事件以及点击该按钮,当事件被触发时,我执行以下处理程序:

onBackButton: function() {
   window.history.length === 0 ? navigator.app.exitApp() : window.history.back();
}

为了确保最大程度的兼容性,我还在项目中添加了history.js

它就像Android上的魅力和Mac上的iOS模拟器一样,但不适用于真实设备。会发生什么是iOS捕获事件但该方法的执行不会更改页面。我已经根据StackOverflow上的先前答案尝试了几种方法,但没有运气。一些示例包括:history.back() not working in phonegap ios buildPhonegap - navigator.app.backHistory() not working on HTML back button

我能尝试什么?

6 个答案:

答案 0 :(得分:5)

你可以简单地使用,

history.go(-1);

导航回来。

答案 1 :(得分:1)

试试这个。

main.js

var pagesHistory = [];
var currentPage = {};
var path = "";

page1.js

currentPage = {};
currentPage.back = function() {
    pagesHistory.pop();
};
currentPage.loadPage2 = function() {
    pagesHistory.push(path + "pages/Page2.html");
};

page2.js

currentPage = {};
currentPage.back = function() {
    pagesHistory.pop();
};
currentPage.loadPage1 = function() {
    pagesHistory.push(path + "pages/Page1.html");
};

参考:http://public.dhe.ibm.com/software/mobile-solutions/worklight/docs/v620/BuildingMultiPageApplicationProject.zip

答案 2 :(得分:1)

几个月前看到这个答案?显然,iOS仅通过脚本导航历史记录时会遇到一些安全问题。这里的答案还包括通过散列网址来解决问题:StackOverflow Question

答案 3 :(得分:0)

不知道cordova本身是否有导航器..但我通常使用此功能返回:

function goBack() {
    //or history.back()
    history.go(-1);
    navigator.app.backHistory();
}

无法测试它。

编辑: 由于你没有通过ajax完全刷新和加载几乎所有东西,你可能必须自己实现历史记录... iphone在返回时只有javascript页面有一些问题。既然你将你的行动推向历史,那就不应该变得艰难:

window.addEventListener("popstate", function(e) {
    //get it from the history, execute your functions to show the page as usual
});

答案 4 :(得分:0)

app.application.navigate("#:back")怎么样?

答案 5 :(得分:-1)

我不使用Cordova,但此代码可能会对您有所帮助:

String . prototype . isEmpty = function () { return this . length === 0; };

var browserHistory;

function hash ( name, historyChange )
{
    "use strict";
    if ( name !== undefined )
    {
        if ( hash () !== name )
        {
            if ( ! historyChange ) { browserHistory . add ( name ); }
            window . location . hash = name;
        }
    }
    else
    {
        var newHash = window . location . hash . split ( "#" ) [ 1 ];
        return newHash === undefined ? "" : newHash;
    }
}

browserHistory =
{
    currentIndex : 0,
    history : [],
    add : function ( name )
    {
        "use strict";
        this . currentIndex = this . currentIndex + 1;
        if ( this . history . length - 1 > this . currentIndex ) { this . history . splice ( this . currentIndex ); }
        this . history . push ( name );
    },
    backward : function ()
    {
        "use strict";
        if ( this . currentIndex === 0 ) { return; }
        this . currentIndex = this . currentIndex - 1;
        this . changeHash ();
    },
    changeHash : function ()
    {
        "use strict";
        hash ( this . history [ this . currentIndex ], true );
    },
    forward : function ()
    {
        "use strict";
        if ( this . currentIndex === this . history . length - 1 ) { return; }
        this . currentIndex = this . currentIndex + 1;
        this . changeHash ();
    },
    init : function ( name )
    {
        "use strict";
        this . history . push ( name );
    }
};

window . onhashchange = function ()
{
    "use strict";
    if ( hash () . isEmpty () ) { load ( { name: "" } ); }
    else { load ( { name: hash () } ); }
};

window . onload = function ()
{
    "use strict";
    if ( ! hash () . isEmpty () )
    {
        browserHistory . init ( hash () );
        load ( { name: hash () } ); 
    }
    else { browserHistory . init ( "" ); }
};

这个脚本:
1)使用使用哈希的网站(http(s)://(www.)name.domain /#urlHash)。

Examle:
https://www.example.com/page - default url
https://www.example.com/page#login - login subpage
https://www.example.com/page#images - images subpage
etc.

2)"窗口。的onload"函数检查输入的url是否包含一个hash和init browserHistory,或者包含:"" (空字符串) - 没有哈希是我的主页
3)" browserHistory"对象保存页面历史
4)&​​#34;哈希"不带参数调用的函数返回当前url哈希并使用" name"参数更改网址哈希
5)当哈希值改变时#34;窗口。 onhashchange"功能称为 6)"窗口。 onhashchange"功能检查哈希
如果url不包含hash,则脚本会加载默认页面 如果url包含哈希,则脚本会根据哈希加载子页面 7)在功能"加载" (这里没有描述)我有一个XMLHttpRequest,它使用name参数调用php文件并设置为从该php文件返回的主div元素html代码。
8)而不是(例如):

<a class="a_nice_style" href="https://www.example.com/images.html>Images gallery</a>

您可以使用(例如):

<p class="a_nice_style" onclick="hash ( 'images' );">Images gallery</p>

9)名为:&#34; load&#34;将对象作为参数。此对象发送到php文件(作为&#34; $ _ GET&#34;或&#34; $ _ POST&#34;数组),因此您可以调用&#34; load&#34;具有自定义对象的函数,该自定义对象包含例如登录字段值 10)&#34; browserHistory&#34;只有你页面的哈希。

这将是你的按钮onclick功能:

onBackButton: function() { browserHistory . backward (); }

您可以修改&#34; browserHistory。向后&#34;通过替换退出您的应用程序的功能:&#34; return;&#34;在这一行:

if ( this . currentIndex === 0 ) { return; }

使用您的应用程序退出代码。