相关:
本文也可以在我的博客这里找到。
解决方案
首先,您需要了解jQM页面事件及其流程。
$(document).on('pageinit',function(){
$.mobile.loading( 'show' );
});
确实是的替代品:
$(document).ready(function () {
$.mobile.loading('show');
});
但是jQM页面由几个阶段组成。在您的情况下,为了能够显示加载符号,您需要使用pageshow事件。必须显示页面才能显示加载符号。我为您创建了一个示例:http://jsfiddle.net/Gajotres/Nncem/。在其中转到下一页以查看加载符号。您还可以将pageshow替换为pageinit以查看差异。
您应该使用这段代码:
$(document).live('pageshow', function (e, data) {
$.mobile.loading('show');
});
但是即使这样也不是正确的方式,最好的jQM方法是使用以下语法:
$('div[data-role="page"]').live('pageshow', function (e, data) {
$.mobile.loading('show');
});
或者如果您想将它绑定到单个页面,请使用以下代码:
$('#pageID').live('pageshow', function (e, data) {
$.mobile.loading('show');
});
其中pageID是您页面的ID。
$(document).on('pageinit')与$(document).ready()的区别
在jQuery中,您学到的第一件事就是调用$(document).ready()函数内的代码,以便在DOM加载完成后立即执行所有内容。然而,在jQuery Mobile中,使用Ajax在您导航时将每个页面的内容加载到DOM中。由于这个原因,$(document).ready()将在加载第一个页面之前触发,且所有意图进行页面操作的代码将在页面刷新后执行。这可能是一个非常微妙的错误。在某些系统上,它可能表现得很正常,但在其他系统上,它可能会导致不稳定、难以重复的怪异情况发生。
经典的jQuery语法:
$(document).ready() {
});
为了解决这个问题(相信我这是一个问题),jQuery Mobile开发人员创建了页面事件。简而言之,页面事件是在页面执行特定点触发的事件。其中之一是pageinit事件,我们可以像这样使用它:
$(document).on('pageinit', function(){
});
我们甚至可以进一步使用页面id而不是文档选择器。假设我们有一个带有id为index的jQuery Mobile页面:
<div data-role="page" id="index">
<div data-theme="a" data-role="header">
<h3>
First Page
</h3>
<a href="#second" class="ui-btn-right">Next</a>
</div>
<div data-role="content">
<a href="#" data-role="button" id="test-button">Test button</a>
</div>
<div data-theme="a" data-role="footer" data-position="fixed">
</div>
</div>
为了执行仅可在首页使用的代码,我们可以使用以下语法:
$('#index').on('pageinit', function(){
});
Pageinit事件将在每次页面即将被加载和第一次显示时执行。除非手动刷新页面或关闭ajax页面加载,否则它不会再次触发。如果您希望在每次访问页面时都执行代码,则最好使用pagebeforeshow事件。
这是一个有效的示例:http://jsfiddle.net/Gajotres/Q3Usv/,用于演示此问题。
关于这个问题还有几点需要注意。无论您使用单个html多个页面还是多个html文件的范例,建议将所有自定义javascript页面处理分离到一个单独的js文件中。这不会使您的代码更好,但您将拥有更好的代码概述,特别是在创建jQuery Mobile应用程序时。
还有另一个特殊的jQuery Mobile事件,称为mobileinit。当jQuery Mobile启动时,它会在文档对象上触发一个mobileinit事件。要覆盖默认设置,请将其绑定到mobileinit。 mobileinit使用的一个很好的示例是关闭ajax页面加载或更改默认的ajax加载器行为。
$(document).on("mobileinit", function(){
});