У меня есть одностраничное веб-приложение, созданное с помощью jQuery Mobile. После того, как пользователь выполнит определенное действие, я хочу программно вернуть его на страницу меню, что включает в себя возвращение в историю и последующее выполнение некоторых действий с элементами страницы меню.
Просто делать
window.history.go(-1); //or $.mobile.back();
doSomethingWith(menuPageElement);
не работает, потому что действие возврата является асинхронным, т.е. мне нужен способ ожидания загрузки страницы перед вызовом doSomethingWith()
.
В итоге я использовал window.setTimeout(), но мне интересно, нет ли более простого способа (другого шаблона?) Сделать это в jQM. Еще один вариант — слушать события загрузки страницы, но я считаю его хуже с точки зрения организации кода.
(РЕДАКТИРОВАТЬ: оказывается, что собственные промисы js не поддерживаются в Mobile Safari, их нужно будет заменить сторонней библиотекой)
//promisify window.history.go()
function go(steps, targetElement) {
return new Promise(function(resolve, reject) {
window.history.go(steps);
waitUntilElementVisible(targetElement);
//wait until element is visible on page (i.e. page has loaded)
//resolve on success, reject on timeout
function waitUntilElementVisible(element, timeSpentWaiting) {
var nextCheckIn = 200;
var waitingTimeout = 1000;
timeSpentWaiting = typeof timeSpentWaiting !== 'undefined' ? timeSpentWaiting : 0;
if ($(element).is(":visible")) {
resolve();
} else if (timeSpentWaiting >= waitingTimeout) {
reject();
} else { //wait for nextCheckIn ms
timeSpentWaiting += nextCheckIn;
window.setTimeout(function() {
waitUntilElementVisible(element, timeSpentWaiting);
}, nextCheckIn);
}
}
});
}
который можно использовать следующим образом:
go(-2, menuPageElement).then(function() {
doSomethingWith(menuPageElement);
}, function() {
handleError();
});
Публикация здесь, а не в обзоре кода, поскольку вопрос касается альтернативных способов сделать это в jQM/js, а не производительности/безопасности самого кода.