Cordova - window.history.back() не работает над кнопкой возврата HTML в iOS 9
В моем приложении я использую window.history.back для перехода к предыдущему виду
Объявление кнопки возврата
<div class="back_icon" id="verification_back_icon"><a href="#" data-rel="back" data-transition="slidedown"><img src="images/back_btn.png" width="23"/></a></div>
Действие кнопки:
$("#verification_back_icon").on("click", function(e)
{
if(checkDirtyVacation())
{
e.preventDefault();
if(backbtnAlt== false)
{
backbtnAlt =true;
confirm("All data will be lost. Do you want to continue?",
function(r){
if(r){
//onBackKeyDown();
clearVacationvalues();
window.history.back();//this is not working in iOS 9
}else{
}
backbtnAlt =false;
});
}
}
else
{
e.preventDefault();
if($(".vaction_location").hasClass("chkSelect"))
{
$(".vaction_location").removeClass("chkSelect");
$(".vaction_location").addClass("chkUnSelect");
}
window.history.back();
}
});
Это работало отлично до iOS 8.4. В iOS 9 эта навигация не работает.
я использую Apache Cordova native platform version 3.8.0
,
Если кто сталкивается с подобной проблемой, пожалуйста, предложите мне. Я пытался с history.back не работает на iOS с использованием Cordova, но не повезло
Спасибо.
6 ответов
РЕШЕНИЕ:
Эта строка решила мою проблему:
history.go(0);
Я заменил window.history.back()
с history.go(0);
Теперь у меня нормально работает в iOS 9
В index.html
<script type="text/javascript">$.mobile.hashListeningEnabled = false;</script>
Добавьте это в функцию onDeviceReady:
function onDeviceReady()
{
if(device.platform === "iOS" && parseInt(device.version) === 9){
$.mobile.hashListeningEnabled = false;
}
if ( ! ( $.mobile.hashListeningEnabled &&
$.mobile.path.isHashValid( location.hash ) &&
( $( hashPage ).is( ":jqmData(role='page')" ) ||
$.mobile.path.isPath( hash ) ||
hash === $.mobile.dialogHashKey ) ) ) {
// make sure to set initial popstate state if it exists
// so that navigation back to the initial page works properly
if ( $.event.special.navigate.isPushStateEnabled() ) {
$.mobile.navigate.navigator.squash( path.parseLocation().href );
}
$.mobile.changePage( $.mobile.firstPage, {
transition: "none",
reverse: true,
changeHash: false,
fromHashChange: true
});
} else {
// trigger hashchange or navigate to squash and record the correct
// history entry for an initial hash path
if ( !$.event.special.navigate.isPushStateEnabled() ) {
$window.trigger( "hashchange", [true] );
} else {
// TODO figure out how to simplify this interaction with the initial history entry
// at the bottom js/navigate/navigate.js
$.mobile.navigate.history.stack = [];
$.mobile.navigate( $.mobile.path.isPath( location.hash ) ? location.hash : location.href );
}
}
Проверка версии ОС устройства (как history.go(0)
работает только с iOS 9) До версии iOS 9 window.history.back()
работает отлично
А теперь добавьте этот кусок кода вместо window.history.back()
if(device.platform === "iOS" && parseInt(device.version) === 9){
console.log("version" + device.version);
console.log("iOS 9");
history.go(0);
//write your code here
}
else{
window.history.back();
}
Чтобы исправить это сообщение "Не удалось загрузить веб-страницу с ошибкой: CDVWebViewDelegate: навигация началась, когда состояние =1" в консоли, добавьте приведенный ниже код в CDVWebViewDelegate.m
В - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*) запрашивает навигационный тип:(UIWebViewNavigationType)navigationType
Метод Комментируйте этот фрагмент кода, показанный ниже:
/* if ([_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
NSDictionary* errorDictionary = @{NSLocalizedDescriptionKey : description};
NSError* error = [[NSError alloc] initWithDomain:@"CDVWebViewDelegate" code:1 userInfo:errorDictionary];
[_delegate webView:webView didFailLoadWithError:error];
}*/
Проблема в том, что настройка window.location.hash
является асинхронным в iOS 9.0 UIWebview (используется Cordova/Phonegap) - подробности см. в этом отчете об ошибках.
Это вызывает проблемы при использовании jQuery Mobile, который по умолчанию использует window.location.hash
перемещаться между "страницами". Это также вызывает проблемы с всплывающими окнами / диалоговыми окнами / меню выбора, которые используют этот механизм.
Вы можете исправить это, запретив jQuery Mobile автоматически прослушивать / использовать location.hash:
$(document).on("deviceready", function(){
$.mobile.hashListeningEnabled = false;
});
Тем не менее, я обнаружил, что это имеет побочные эффекты на Android, такие как неиспользование аппаратной кнопки "назад", поэтому я специально нацелил ее на iOS 9 с помощью https://github.com/apache/cordova-plugin-device:
$(document).on("deviceready", function(){
if(device.platform === "iOS" && parseInt(device.version) === 9){
$.mobile.hashListeningEnabled = false;
}
});
Обратите внимание, что я использую navigator.app.backHistory()
не window.history.back()
в сочетании с hashListeningEnabled = false
- это может иметь значение.
В качестве альтернативы вы можете использовать этот плагин для использования нового WKWebView на iOS 8 и 9. WKWebView используется Safari на iOS 8+, поэтому сайты JQM, просматриваемые в браузере на iOS 9, не сталкиваются с этими проблемами. cordova-ios 3 по-прежнему использует UIWebView из- за ошибки в WKWebView в iOS 8, но в предстоящем cordova-ios 4 будет поддерживаться основной плагин WKWebView для iOS 9+. Обратите внимание, что при использовании WKWebView с приложениями Cordova / Phonegap существуют дополнительные соображения из-за его более строгой безопасности, например, требование наличия заголовков CORS для ответов XHR.
Я думаю, что это действие по умолчанию тега A вызывает ошибку. Поэтому я просто предотвращаю действие по умолчанию, добавив return false
в конце функции обработчика кликов
И это работает.
- HTML
<a id="back-btn">back</a>
Javascript
$('#back-btn').on('click', function(e) { window.history.go(-1); return false; })
Отключение push-состояния сработало для меня:
$.mobile.pushStateEnabled = false;
@Sujania,
По словам команды phonegap, iOS9 официально не поддерживается. Эта проблема может быть еще одна ошибка в iOS9. Возможно, вам придется ждать исправления.
PhoneGap Build iOS 9 Состояние поддержки
http://community.phonegap.com/nitobi/topics/phonegap-build-ios-9-support-status
Итог: iOS 9 официально не поддерживается до Cordova-iOS 4.0.0, над которой команда Cordova усердно работает. Однако некоторые проблемы могут быть решены с помощью простых изменений конфигурации.
На данный момент о 4 ошибках сообщается в хранилище Cordova Bug. Ваша проблема не появляется в репозитории - по состоянию на эту дату.
https://issues.apache.org/jira/browse/CB-9684?jql=text%20~%20%22iOS9%22
Попробуй это
if(r){
try{
var nav = window.navigator;
if( this.phonegapNavigationEnabled && nav && nav.app && nav.app.backHistory )
{
nav.app.backHistory();
}
else
{
window.history.back();
}
}
catch(e)
{
alert(e);
}
}