介绍
在这里找到的所有信息也可以在我的博客文章中找到,您还可以找到工作示例。
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,所以每次页面更改基本上都是页面刷新/重新加载。
我希望这能回答你所有的问题。如果您需要澄清,请在评论部分询问他们。
编辑 :
- 您应该在哪里加载数据取决于您需要加载什么。如果您只想执行一次,请使用
pageinit
. 如果您在每次访问页面时都需要它,请使用pagebeforeshow
(因为如果您使用pageshow
该内容会突然出现,并且可能会使用户感到困惑)。不要使用pagebeforecreate
,因为内容会在活动结束后加载,所以没有必要使用它。
如果您想在某个时间间隔内加载内容,请使用pageinit
setinterval 函数。每次添加动态内容时,不要忘记手动增强页面内容样式。
Pageshow
仅在需要页面高度的插件初始化时才有用。没有什么特别的。从答案 1 中,您可以看到它对动态内容不利,因为它会从无处出现。
Pageinit
应该用于事件绑定和动态内容生成。
- 明天我将用每个页面事件的用例来更新我的答案。我希望这对你来说已经足够了。