首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$(Document)pageinit和$(document).on('pageinit')的区别

$(Document)pageinit和$(document).on('pageinit')的区别
EN

Stack Overflow用户
提问于 2012-12-14 19:48:38
回答 4查看 24.6K关注 0票数 13

我使用的是jquery mobile,我想重现下面的代码:

代码语言:javascript
运行
复制
$(document).ready(function () {
    $.mobile.loading('show');
});

它会显示微调器,直到我决定在其他函数中将其隐藏

代码语言:javascript
运行
复制
$.mobile.loading( 'hide' );

现在我发现document.ready()在jquery Mobile1.2中被弃用了,所以他们建议用$(document).on('pageinit')来代替它

但如果我将我的代码替换为建议的代码微调控件自动隐藏...为什么?这是新的代码:

代码语言:javascript
运行
复制
 $(document).on('pageinit',function(){
     $.mobile.loading( 'show' );
 });
EN

回答 4

Stack Overflow用户

发布于 2012-12-15 00:20:59

相关信息:

这篇文章也可以在我的博客中找到。

解决方案

首先,您需要了解jQM页面事件及其流。

代码语言:javascript
运行
复制
$(document).on('pageinit',function(){
    $.mobile.loading( 'show' );
});

确实取代了:

代码语言:javascript
运行
复制
$(document).ready(function () {
    $.mobile.loading('show');
});

但是jQM页面由几个阶段组成。在您的示例中,为了能够显示微调器,您需要使用pageshow事件。页面必须显示才能显示微调器。我已经为您创建了一个示例:http://jsfiddle.net/Gajotres/Nncem/。在其中转到下一页以查看微调器。您还可以用pageinit替换页面显示,以查看不同之处。

您应该使用以下代码:

代码语言:javascript
运行
复制
$(document).live('pageshow', function (e, data) {
    $.mobile.loading('show');
});  

但即使这不是一种正确的方式,最好的jQM方式也是使用以下语法:

代码语言:javascript
运行
复制
$('div[data-role="page"]').live('pageshow', function (e, data) {
    $.mobile.loading('show');
});    

或者,如果您想将其绑定到单个页面,请使用以下代码:

代码语言:javascript
运行
复制
$('#pageID').live('pageshow', function (e, data) {
    $.mobile.loading('show');
});  

其中pageID是页面的ID。

$(document).on('pageinit') vs $(document).ready()

您在jQuery中学到的第一件事是调用$(document).ready()函数内部的代码,以便加载DOM后立即执行所有操作。但是,在jQuery 中,Ajax用于在导航时将每个页面的内容加载到DOM中。因此,$(document).ready()将在加载第一个页面之前触发,而用于页面操作的所有代码都将在页面刷新后执行。这可能是一个非常微妙的bug。在一些系统上,它可能看起来运行良好,但在其他系统上,它可能会导致不稳定的、难以重复的怪异现象发生。

经典jQuery语法:

代码语言:javascript
运行
复制
$(document).ready() { 

});

为了解决这个问题(相信我,这是一个问题),jQuery 开发人员创建了页面事件。简而言之,页面事件是在特定的页面执行点触发的事件。其中一个页面事件是pageinit事件,我们可以这样使用它:

代码语言:javascript
运行
复制
$(document).on('pageinit', function(){

});

我们可以更进一步,使用页面id而不是文档选择器。假设我们有一个带有id 索引的jQuery移动页面

代码语言:javascript
运行
复制
<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>

要执行仅对索引页可用的代码,我们可以使用以下语法:

代码语言:javascript
运行
复制
$('#index').on('pageinit', function(){

});

Pageinit事件将在每次页面第一次加载和显示时执行。除非手动刷新页面或关闭ajax页面加载,否则不会再次触发。如果您希望每次访问页面时都执行代码,最好使用pagebeforeshow事件。

这里有一个有效的例子:http://jsfiddle.net/Gajotres/Q3Usv/来演示这个问题。

关于这个问题还有更多的注释。无论您使用的是1html、多页面还是多html文件范例,都建议将所有自定义javascript页面处理分离到一个单独的js文件中。这将使您的代码变得更好,但您将获得更好的代码概述,特别是在创建jQuery移动应用程序时。

还有另一个特殊的移动文档启动事件,称为mobileinit.When jQuery移动启动,它在文档对象上触发一个mobileinit事件。要覆盖默认设置,请将它们绑定到mobileinit。使用ajax mobileinit的一个很好的例子是关闭ajax页面加载,或者更改默认的ajax加载程序行为。

代码语言:javascript
运行
复制
$(document).on("mobileinit", function(){
  //apply overrides here
});
票数 11
EN

Stack Overflow用户

发布于 2012-12-14 20:12:33

这个

代码语言:javascript
运行
复制
$(document).on('pageinit')

方法是让jquery mobile在动态页面加载发生后触发。

代码语言:javascript
运行
复制
$(document).ready()

不会表现得像

代码语言:javascript
运行
复制
$(document).on('pageinit')

因为它只在页面加载时触发一次。

票数 3
EN

Stack Overflow用户

发布于 2012-12-14 19:53:16

试一试

为了展示

代码语言:javascript
运行
复制
$.mobile.showPageLoadingMsg();

用于隐藏

代码语言:javascript
运行
复制
$.mobile.hidePageLoadingMsg();

如果动态追加内容,则必须隐藏微调器

check this one

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13878117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档