Javascript jquerymobile-pageinit与pageshow

Javascript jquerymobile-pageinit与pageshow,javascript,jquery,cordova,jquery-mobile,jquery-mobile-pageshow,Javascript,Jquery,Cordova,Jquery Mobile,Jquery Mobile Pageshow,我对jquerymobile中pageinit和pageshow方法的用法有点困惑。我知道在初始化期间会调用pageinit,每次呈现页面时都会调用pageshow 我有一个主页,在某些部分使用$.ajax()加载数据。我正在pageinit中加载数据。我还仅为pageinit绑定单击和滑动事件。我还注意到,当您从另一个页面返回时,不会调用pageinit 我还有一个问题,我们使用的旋转木马使用的是swipe.js——当使用pageinit方法时,它不能正确加载,但在pageshow方法中加载时

我对jquerymobile中
pageinit
pageshow
方法的用法有点困惑。我知道在初始化期间会调用
pageinit
,每次呈现页面时都会调用
pageshow

我有一个主页,在某些部分使用
$.ajax()
加载数据。我正在
pageinit
中加载数据。我还仅为
pageinit
绑定单击和滑动事件。我还注意到,当您从另一个页面返回时,不会调用
pageinit

我还有一个问题,我们使用的旋转木马使用的是
swipe.js
——当使用
pageinit
方法时,它不能正确加载,但在
pageshow
方法中加载时工作正常。当我们使用浏览器后退按钮时,调用
pageinit
的原因可能是什么

此外,缓存在决定将加载数据、绑定事件等的逻辑放在何处时起到了什么作用?最好有人能解释一下,比如说加载主页数据,然后导航并从另一个页面返回。

Intro 在这里找到的所有信息也可以在我的博客中找到,您还可以找到工作示例

pageinit和pageshow之间的区别 让我们从头开始。正如您已经知道的,jQuery开发人员为我们提供了页面事件,以弥补DocumentReady无法完成的差距。虽然documentready可以告诉您DOM中的内容已经准备好了,但我们需要更多,因为jquerymobile仍然需要增强内容标记(增强内容样式)

有页面事件,每个页面事件都有其目的。有些会在增强页面内容之前触发(如),以便添加动态内容。有些仅在页面更改期间触发,如

但让我们回到你的问题上来
Pageinit
是jQuery移动版的
文档就绪
。虽然您仍然可以使用“文档准备就绪”,但在页面事件中使用相同的选项仍然是合乎逻辑的

正如您已经说过的,您正在使用
pageinit
进行事件绑定(如单击或滑动事件),这是一个很好的解决方案。主要是因为jQuery Mobile遇到了一个称为“多事件绑定”的问题。例如,如果有一个单击事件绑定到一个元素,则没有任何东西可以阻止另一个单击事件绑定到同一个元素。如果您使用
pageshow
事件,就会发生这种情况。如果在
pageshow
事件期间使用事件绑定,则每次访问页面时,同一事件都会被反复绑定。它可以很容易地预防,但同样的预防将需要额外的处理器处理能力,同样的能力可以用来处理web应用程序的其余部分

这里我们有另一个问题(您的问题之一),那么
pageshow
的目的是什么?显而易见的答案是使用一个可用且显示的页面。正确的答案并不重要
Pageshow
非常重要,因为它是唯一可以正确计算页面高度的页面事件,而不是0。现在,您可以了解为什么您的旋转木马需要在该点进行初始化。像许多其他插件(图表、图像库)一样,旋转木马需要正确的页面高度,如果您在
pageshow
之前初始化它们,它们的高度将为0,因此它们将存在,但您将无法看到它们

关于上一个问题,如果应用程序构建正确,缓存不会起作用。首先,您应该始终使用委托事件绑定,因为它不关心页面元素是否存在。基本上,如果您将事件绑定到某个父元素(如文档),那么页面是缓存还是从DOM中删除并不重要。一旦它回来,同样的事件将再次发生

例如:

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

});
此方法将一个单击事件绑定到文档,但同一个单击事件仅适用于id为“
some button”的元素。该元素是否存在实际上并不重要,因为文档对象将始终存在

如果您使用的是普通的web页面,而页面重新加载/刷新是一件常见的事情,那么同样的逻辑就不那么重要了。甚至在jquerymobile中,如果关闭了ajax,那么每次页面更改基本上都是页面刷新/重新加载

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

编辑:

  • 在哪里加载数据取决于需要加载的内容。如果只想执行一次,请使用
    pageinit
    。如果每次访问页面时都需要它,那么请使用
    pagebeforeshow
    (因为如果使用
    pageshow
    ,内容将不知从何处出现,并会让用户感到困惑)。不要在创建前使用页面,因为内容将在事件结束后加载,所以使用它没有意义
  • 如果要在某个时间间隔内加载内容,请使用带有setinterval函数的
    pageinit
    。每次添加动态内容时,不要忘记页面内容样式

  • Pageshow
    仅在插件初始化需要页面高度时才有用。没什么特别的。从答案1中,你可以看出这对动态内容是有害的,因为它会在任何地方出现
  • Pageinit
    应用于事件绑定和动态内容生成

  • 明天我将用每个页面事件的用例更新我的。我希望这对你来说足够了

  • Gajotres-我认为这是一个更重要的问题