使用 hijax 样式的链接时,这似乎是不可能的。但是,您可以使用多页 HTML 文档并在pagebeforechange
事件中自己加载动态页面内容。
所以在 中index.html
,我已经添加了内容为空的“时间”页面:
<div data-role="page" id="home">
<div data-role="header"><h1>Home</h1></div>
<div data-role="content"><a href="#time">Time</a></div>
</div>
<div data-role="page" data-add-back-btn="true" id="time">
<div data-role="header">
<h1>Time</h1>
<a href="#" class="reload ui-btn-right" data-role="button" data-icon="refresh">Reload</a>
</div>
<div data-role="content"></div>
</div>
接下来,我拦截pagebeforechange
事件:如果是“时间”页面,我们将从 URL 加载页面内容time.php
。
$(document).bind('pagebeforechange', function(e, data) {
if(typeof data.toPage == 'string') {
var u = $.mobile.path.parseUrl(data.toPage);
if(u.hash == "#time") {
loadPageContent($('#time'), 'time.php', data.options);
e.preventDefault();
}
}
});
由于我想在更改页面之前等待 Ajax 请求返回,因此我阻止了页面更改;loadPageContent
将不得不这样做。
loadPageContent
我可以为“重新加载”按钮做类似的事情:
$(document).ready(function() {
$('#time .reload').bind('click', function(e) {
loadPageContent($('#time'), 'time.php', undefined, $(e.target).closest(".ui-btn"));
});
});
这是代码loadPageContent
:
function loadPageContent(page, url, options, button) {
if(typeof button != "undefined")
button.addClass($.mobile.activeBtnClass);
$.mobile.showPageLoadingMsg($.mobile.loadingMessageTheme, $.mobile.loadingMessage, $.mobile.loadingMessageTextVisible);
var content = page.children(':jqmData(role=content)');
content.load(url, function(response, status, xhr) {
if(status == "success") {
page.page();
content.trigger('create');
$.mobile.hidePageLoadingMsg();
if(typeof button != "undefined")
button.removeClass($.mobile.activeBtnClass);
$.mobile.changePage(page, options);
} else {
$.mobile.hidePageLoadingMsg();
$.mobile.showPageLoadingMsg($.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true);
setTimeout(function() {
$.mobile.hidePageLoadingMsg();
if(typeof button != "undefined")
button.removeClass($.mobile.activeBtnClass);
}, 1000);
}
});
}
这已经是一个相当精致的版本了:它会显示页面加载消息,并且在请求失败时会显示 1s 的错误消息。在成功请求结束时,它将使用create
触发器增强内容,并进行页面更改。如果传递了重新加载按钮,它将在操作进行时将此按钮标记为活动。