我有一个使用 jQuery Mobile 构建的单页 Web 应用程序。在用户完成某个操作后,我想以编程方式将他们带回菜单页面,这涉及到返回历史,然后对菜单页面的元素执行一些操作。
简单地做
window.history.go(-1); //or $.mobile.back();
doSomethingWith(menuPageElement);
不起作用,因为返回动作是异步的,即我需要一种在调用之前等待页面加载的方法doSomethingWith()
。
我最终使用了 window.setTimeout(),但我想知道在 jQM 中是否没有更简单的方法(不同的模式?)。另一种选择是监听页面加载事件,但从代码组织的角度来看,我发现它更糟。
(编辑:原来移动 Safari 不支持原生 js 承诺;需要由第 3 方库替换)
//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 中执行此操作的替代方法,而不是代码本身的性能/安全性。