history.back не работает на iOS с использованием Cordova

У меня есть гибридное приложение, разработанное с помощью Cordova. Приложение очень простое, поэтому я не использовал фреймворк. Почти все страницы внедряются через Ajax с использованием метода jQuery ajax(), а затем добавляются в историю с помощью HTML5 History API с помощью метода pushState().

Чтобы позволить пользователю вернуться на ранее посещенную страницу (страницу в истории), я создал кнопку. Я прослушиваю событие backbutton, а также нажимаю на эту кнопку, и когда событие запускается, я выполняю следующий обработчик:

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

Чтобы обеспечить максимальную совместимость, я также добавил history.js в проект.

Он отлично работает на Android и в симуляторе iOS на Mac, но не работает на реальном устройстве. Что происходит, так это то, что iOS перехватывает событие, но выполнение метода не меняет страницу. Я уже пробовал несколько методов, основанных на предыдущих ответах на StackOverflow, но не повезло. Некоторые примеры: history.back() не работает в сборке phonegap ios и Phonegap - navigator.app.backHistory( ) не работает кнопка возврата HTML.

Что я могу попробовать?


person Aurelio De Rosa    schedule 22.06.2014    source источник
comment
Вы проверили список ошибок Кордовы? Я имел дело с этими работами на симуляторе, но не с проблемами устройства, и они невероятно расстраивают.   -  person Zarathuztra    schedule 22.06.2014
comment
@Zarathuztra К сожалению, я не нашел никаких проблем, связанных с этим.   -  person Aurelio De Rosa    schedule 22.06.2014
comment
Просто спрашиваю, а можете ли вы создавать объекты истории, чтобы использовать их вместо этого? Что-то вроде печенья...   -  person Marko Vasic    schedule 27.06.2014
comment
Что-то вроде этого developer.mozilla.org/en -US/docs/Web/Guide/API/DOM/   -  person Marko Vasic    schedule 27.06.2014
comment
@AurelioDeRosa Можете ли вы поделиться минимальным кодом из проекта, который можно использовать для воспроизведения проблемы?   -  person Surajit Sarkar    schedule 27.06.2014
comment
попробуйте этот Получить предыдущую страницу phonegap javascript   -  person brahimm    schedule 20.04.2017


Ответы (6)


Видели этот ответ несколько месяцев назад? Очевидно, у iOS есть некоторые проблемы с безопасностью, когда дело доходит до навигации по истории только с помощью скрипта. Ответ здесь также включает обходной путь путем хеширования URL-адресов: Вопрос StackOverflow

person James Hunt    schedule 02.07.2014

Вы можете просто использовать,

history.go(-1);

чтобы вернуться назад.

person totten    schedule 02.07.2014
comment
Почему это должно отличаться от history.back()? - person Aurelio De Rosa; 02.07.2014
comment
Не знаю, попробуйте :) - person totten; 02.07.2014

Попробуй это.

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");
};

страница2.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

person Mohammad Nurdin    schedule 02.07.2014

Не знаю, есть ли в самой кордове навигатор.. но я обычно использовал эту функцию для возврата:

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
});
person Agash Thamo.    schedule 02.07.2014
comment
навигатор есть, а приложения нет :| - person deadManN; 16.12.2015

Как насчет app.application.navigate("#:back")?

person zkent    schedule 28.01.2015

Я не использую 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) функция "window .onload" проверяет, содержит ли введенный URL хэш, и инициализирует историю браузера с ним или с помощью: "" (пустая строка) - хеш не является моей главной страницей
3) объект "browserHistory" сохраняет историю страницы< br> 4) функция "hash", вызванная без аргументов, возвращает текущий хэш URL, а с параметром "name" изменяет хеш URL
5) При изменении хэша вызывается функция "window .onhashchange"
6) "window .onhashchange" " функция проверки хэша
Если URL не содержит хеш, скрипт загружает страницу по умолчанию.
Если URL содержит хеш, скрипт загружает подстраницу на основе хеша.
7) В функции "загрузить" ( здесь не описано) У меня есть XMLHttpRequest, который вызывает php-файл с аргументом имени и устанавливает html-код основного элемента div, который был возвращен из этого php-файла.
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) Функция с именем: «загрузить» имеет объект в качестве параметра. Этот объект отправляется в файл php (в виде массива «$_GET» или «$_POST»), поэтому вы можете вызвать функцию «загрузить» с настраиваемым объектом, который содержит, например, значения полей входа в систему.
10) «browserHistory» имеет только хэши вашей страницы.

Это будет ваша функция onclick кнопки:

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

Вы можете изменить функцию «browserHistory .back», чтобы выйти из приложения, заменив: «return;» в этой строке:

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

с кодом выхода вашего приложения.

person s77s    schedule 01.07.2014
comment
Честно говоря, этот ответ кажется мне копией/вставкой, потому что вы много говорите о PHP :) - person Aurelio De Rosa; 02.07.2014
comment
Я использую PHP5, когда не могу что-то сделать в JavaScript, который интерпретируется браузером. Я загружаю подстраницу, вызывая код PHP5 из JavaScript XMLHttpRequest (JQuery, вероятно, использует это в: функция ajax - обычно я не использую JQuery). Этот код PHP5 среди прочего фильтрует содержимое подстраницы (которая находится на сервере) (например, другое содержимое для гостя и другое для зарегистрированного). Вы можете использовать в функции загрузки только код JavaScript и загружать локальные файлы (я не могу загружать файлы с пользовательского ПК без ‹input type='file' ... /›, но вы разрабатываете платформенно-зависимое гибридное приложение). - person s77s; 02.07.2014