这是一个人为的例子:http://jsfiddle.net/adamjford/YNGcm/20/
HTML:
<a href="#">Click me!</a>
<div></div>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
function getSomeDeferredStuff() {
var deferreds = [];
var i = 1;
for (i = 1; i <= 10; i++) {
var count = i;
deferreds.push(
$.post('/echo/html/', {
html: "<p>Task #" + count + " complete.",
delay: count
}).success(function(data) {
$("div").append(data);
}));
}
return deferreds;
}
$(function() {
$("a").click(function() {
var deferreds = getSomeDeferredStuff();
$.when(deferreds).done(function() {
$("div").append("<p>All done!</p>");
});
});
});
Run Code Online (Sandbox Code Playgroud)
我想要"全部完成!" 在所有延迟任务完成后$.when()出现,但似乎不知道如何处理Deferred对象数组."全部完成!" 首先发生的是因为数组不是Deferred对象,所以jQuery继续并假设它刚刚完成.
我知道可以将对象传递给函数,$.when(deferred1, deferred2, ..., deferredX) …
一些背景;
默认情况下,当您单击指向单独HTML页面的链接时,JQM会在该页面上加载第一个data-role ="page"并将其附加到第一页的DOM,但事情是JQM只加载该页面div而不是任何脚本等容器外面的等等.
我有一个jQuery移动应用程序有5页"login.html""menu.html""account.html""settings.html"..等
我改变页面的样子;
$.mobile.changepage("account.html")
Run Code Online (Sandbox Code Playgroud)
另外,我将所有页面加载逻辑放到我的第一页login.html中 ;
<script>
$(document).on('pageinit', '#loginpage', function() {
//do some stuff run some ajax scripts and add some html to its body
});
$(document).on('pageinit', '#accountpage', function() {
//do some stuff run some ajax scripts and add some html to its body
});
$(document).on('pageinit', '#settingspage', function() {
//do some stuff run some ajax scripts and add some html to its body
});
</script>
Run Code Online (Sandbox Code Playgroud)
虽然这个应用程序运行良好,问题是我发现它非常脆弱,很难从意外错误中幸存下来.例如;
由于每个页面的主体html将如何加载在login.html中定义,这意味着如果用户手动刷新任何这些页面的任何时刻,页面将加载而不运行这些脚本并加载没有正文的空页面.在那一刻,因为从内存中删除了正确的DOM,用户被困在一个装满空页的应用程序中,唯一的方法是他足够智能去输入"login.html"到地址栏然后才能启动所有进程顺利.
我想我们不能100%隐藏地址栏,滚动下来后再次可见.
所以这是我提出的一个问题,其他一些奇怪的事情可能会发生,如果不知何故DOM被破坏只能再次使用应用程序的方法是输入login.html地址栏,用户可能不会对此有所了解.
如何让这个应用程序更健壮,比如检测任何DOM损坏或刷新并将用户转发到login.html,这样他就不会陷入使用空页面的应用程序中.