7

我对jQuery Mobile中的pageinit和方法的使用有点困惑。pageshow我知道这pageinit是在初始化期间调用的,并且pageshow在每次呈现页面时都会调用。

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

我在使用轮播时遇到了另一个问题swipe.js- 使用该方法时它无法正确加载pageinit,但在加载pageshow方法时工作正常。pageinit当我们使用浏览器后退按钮时调用a 的原因可能是什么?

此外,缓存在决定将加载数据、绑定事件等逻辑放置在何处方面是否起任何作用?如果有人可以解释说加载主页数据,然后导航并从另一个页面返回,那将是最好的。

4

1 回答 1

30

介绍

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

pageinit 和 pageshow 的区别

让我们从头开始。如您所知,jQuery 开发人员为我们提供了页面事件来弥补文档准备无法填补的空白。虽然 document ready 可以告诉您内容在 DOM 中已准备就绪,但我们需要的不仅仅是这些,因为 jQuery Mobile 仍然需要增强内容标记(增强内容样式)。

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

但是让我们回到你的问题。Pageinit在这里是一个 jQuery Mobile 版本的document ready. 虽然您仍然可以使用document ready它,但在页面事件中具有相同的选择仍然是合乎逻辑的。

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

在这里,我们还有另一个问题(您的一个问题),那么目的是pageshow什么?显而易见的答案是使用可用和显示的页面做一些事情。虽然正确答案并不重要。Pageshow很重要,因为它是唯一可以正确计算页面高度且不为 0 的页面事件。现在您可以看到为什么需要在此时初始化轮播。像许多其他插件(图表、图片库)一样,轮播需要正确的页面高度,如果您在pageshow它们的高度为 0 之前对其进行初始化,那么它们将存在但您将无法看到它们。

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

例子:

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

});

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

如果您使用的是普通网页,那么同样的逻辑并不那么重要,因为页面重新加载/刷新是很常见的事情。或者如果 ajax 被关闭的话,甚至在这里使用 jQuery Mobile,所以每次页面更改基本上都是页面刷新/重新加载。

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

编辑 :

  1. 您应该在哪里加载数据取决于您需要加载什么。如果您只想执行一次,请使用pageinit. 如果您在每次访问页面时都需要它,请使用pagebeforeshow(因为如果您使用pageshow该内容会突然出现,并且可能会使用户感到困惑)。不要使用pagebeforecreate,因为内容会在活动结束后加载,所以没有必要使用它。

如果您想在某个时间间隔内加载内容,请使用pageinitsetinterval 函数。每次添加动态内容时,不要忘记手动增强页面内容样式。

  1. Pageshow仅在需要页面高度的插件初始化时才有用。没有什么特别的。从答案 1 中,您可以看到它对动态内容不利,因为它会从无处出现。

Pageinit应该用于事件绑定和动态内容生成。

  1. 明天我将用每个页面事件的用例来更新我的答案。我希望这对你来说已经足够了。
于 2013-05-25T19:44:32.420 回答