我对jQuery Mobile中pageinitpageshow方法的使用感到有些困惑。我知道在初始化期间会调用pageinit,并且每次呈现页面时都会调用pageshow
我有一个主页,其中某些部分使用$.ajax()加载数据。我正在pageinit中加载数据。我还绑定(bind)了pageinit的click和swipe事件。我还注意到当您从另一个页面回来时,没有调用pageinit
我在使用swipe.js的轮播时遇到了另一个问题-使用pageinit方法时无法正确加载,但在pageshow方法中加载时效果很好。使用浏览器后退按钮时,调用pageinit的原因可能是什么?
另外,缓存作用在决定将加载数据,绑定(bind)事件等的逻辑放在何处时有作用吗?最好是有人可以解释说加载主页数据,然后导航并从另一个页面返回。

最佳答案

介绍

此处找到的所有信息也可以在我的博客 ARTICLE 中找到,您还将找到工作示例。

pageinit和pageshow之间的区别

让我们从头开始。如您所知,jQuery开发人员为我们提供了页面事件,以弥合文档无法实现的空白。尽管文档准备就绪可以告诉您内容已在DOM中准备就绪,但我们还需要更多,因为jQuery Mobile仍需要增强内容标记(增强内容样式)。

several页面事件,每个事件都有其用途。有些将在增强页面内容之前触发(例如 pagebeforecreate ),以便可以添加动态内容。有些只会在页面更改期间触发,例如 pagebeforechange

但是,让我们回到您的问题。 Pageinit 是jQueryt的jQuery Mobile版本 document ready 。尽管您仍然可以使用 document ready ,但是在页面事件之间使用相同的替代方法仍然是合乎逻辑的。

正如您已经告诉您的那样,您将 pageinit 用于事件绑定(bind)(例如单击或滑动事件),这是一个很好的解决方案。主要是因为 jQuery Mobile 遭受称为“多个事件绑定(bind)”的问题。如果例如您将click事件绑定(bind)到一个元素,则无法阻止另一个click事件被绑定(bind)到同一元素。如果您使用 pageshow 事件,就会发生这种情况。如果您在 pageshow 事件期间使用事件绑定(bind),则每次访问页面时,同一事件都会被一遍又一遍地绑定(bind)。可以很容易地避免这种情况,但是同样的预防措施会占用额外的处理器处理能力,而这种能力可以用来处理Web应用程序的其余部分。

在这里,我们还有另一个问题(您的问题之一), pageshow 的目的是什么?明显的答案是对显示的可用页面进行处理。虽然正确答案并不重要。 Pageshow 很重要,因为这是仅页面事件,在该事件中可以正确计算页面高度,而不是0。现在您可以看到为什么需要在此时初始化轮播。像许多其他插件(图表,图像画廊)一样,轮播也需要正确的页面高度,如果在 pageshow 之前对其进行初始化,它们的高度将为0,因此它们将存在,但您将无法看到它们。

关于您的最后一个问题。如果您的应用程序构建正确,则兑现不会发挥任何作用。首先,您应该始终使用委托(delegate)事件绑定(bind),因为它不会关心页面元素是否存在。基本上,如果您将事件绑定(bind)到某些父元素(例如文档),则页面是否被兑现或从DOM中删除都没有关系。一旦回来,同一事件将再次起作用。

例:

$(document).on('click', '#some-button',function(){

});

此方法会将click事件绑定(bind)到文档,但是相同的click事件仅适用于ID为' some-button' 的元素。该元素是否存在并不重要,因为文档对象将始终存在。

如果您使用普通网页,但页面重新加载/刷新是常见的情况,那么同样的逻辑并不重要。甚至在这里使用jQuery Mobile(如果ajax已关闭),因此每次页面更改基本上都是页面刷新/重新加载。

我希望这能回答您的所有问题。如果您需要澄清,请在评论部分中进行询问。

编辑:
  • 您应该在哪里加载数据取决于您需要加载的内容。如果您只想做一次,则使用 pageinit 。如果您每次访问页面时都需要它,则使用 pagebeforeshow (因为如果使用 pageshow ,内容将无处不在,并且可能使用户感到困惑)。不要使用 pagebeforecreate ,因为内容将在事件结束后加载,因此没有必要使用它。

    如果要以一定的间隔加载内容,请使用带有setinterval函数的 pageinit 。每次添加动态内容时,请不要忘记使用manually enhance页面内容样式。
  • Pageshow 仅在插件初始化要求页面高度时才有用。没什么特别的。从答案1中,您可以看到它是动态内容的床,因为它会无处出现。

    Pageinit 用于事件绑定(bind)和动态内容生成。
  • 明天我将使用每个页面事件的用例更新 answer 。我希望这足以满足您的需求。
  • 09-26 06:56