Jquery mobile 页面加载上的jQuery移动对话框

Jquery mobile 页面加载上的jQuery移动对话框,jquery-mobile,dialog,pageshow,Jquery Mobile,Dialog,Pageshow,正在开发我的第一个jQuery移动应用程序。有一个localStorage值必须在整个应用程序中都有一个值,因此我点击了pageshow事件来检查该值: $(function () { $("div[data-role='page']").on("pageshow", function (event, ui) { if (getValue() == null) { // show the dialog $.mobile.changePage("#dialo

正在开发我的第一个jQuery移动应用程序。有一个localStorage值必须在整个应用程序中都有一个值,因此我点击了pageshow事件来检查该值:

$(function () {
$("div[data-role='page']").on("pageshow", function (event, ui) {
    if (getValue() == null) {
        // show the dialog
        $.mobile.changePage("#dialog");
    }
});
});
这在浏览各个页面时有效,但在加载第一个页面时永远不会被调用。我试图在添加pageshow侦听器的部分下面再次复制上面的If语句,但它的效果是显示对话框,隐藏它,然后再次显示它

在第一个页面上,打开对话框似乎触发了pageshow,这很奇怪,考虑到我的选择器,这反过来又触发了另一个对话框。有没有人对如何解决这个问题有什么建议,或者有更好的方法来解决整个问题

更新1:我试过了

但它的效果与我原来的问题相同,它启动对话框,然后隐藏,然后再次显示。尽管我试图在选择器中过滤掉,但启动对话框似乎是在触发pageshow事件。请注意,如果删除“转换:无”选项,则根本不会显示该对话框

更新2:我还尝试创建一个空白的初始页面,然后做一个简单的页面转换

$.mobile.changePage("#mypage");
但它仍然没有正确的行为。在这种情况下,它确实会将我带到下一页,但pageshow事件不会触发,因为我的对话框不会出现。我知道它没有启动,因为我可以从导航菜单中选择另一个页面,对话框确实会出现


更新3:我更改了连接pageshow侦听器的选择器。我没有选择where data role=page,而是根据特定页面的id来选择它们。然后我重新尝试了我在前两次更新中描述的两种方法,但仍然无法正常工作。首先,当我尝试使用allowSamePageTransition刷新初始页面时,似乎pageshow启动了两次,因为对话框启动了两次。然后,当我尝试使用空白初始页面,然后在连接pageshow侦听器后立即执行重定向时,什么都没有发生,对话框也不会出现。如果我导航到任何其他页面,对话框将按预期工作。我不明白为什么第一页这么麻烦。

最有可能的是,在第一页,当您的代码执行时,该事件已经触发。这就解释了为什么你只在第一页上什么也得不到

关于第二点,这很正常,因为changePage会将页面更改为对话框,一旦关闭对话框,它将返回到上一页。因此,if被执行2次


我的建议是,第一次进入第一个页面时,可以在注册pageshow事件的回调后重新转换到同一页面。

设置显示对话框的时间间隔,而不是在页面显示后调用对话框

$(document).on('pageshow', '#myPage' ,function () {
 if (getValue() == null) {
  setTimeout(function () {
   $.mobile.changePage('#dialog');
  }, 100); // delay above zero
 }
});
这样,该对话框将在pageshow事件中弹出,并且仅弹出一次

更新

我在上面找到了这个有趣的jQueryMobile事件图。它解释了为什么在多页结构的情况下,对话框或弹出窗口在第一页激发两次,而不是在其余页面激发两次。它似乎在页面准备好进入DOM时触发,在pageshow上再次触发。设置超时可防止在pageinit上触发对话框,因此在触发pageshow之前跳过该事件

图像/图表来源:


我使用了pagecreate,到目前为止似乎解决了我的问题

$(document).on('pagecreate', "#page-formyID", function () {

//whatever

});

我尝试过:$.mobile.changePage mypage,{allowSamePageTransition:true};它的效果和我最初的场景一样。它会启动对话框,然后隐藏,然后再次显示。我已更新了我的原始帖子,其中包括我尝试进行的两次不同更新。两者都没有成功。虽然这确实有效,但我很想了解为什么在更新1 allowSamePageTransition中pageshow事件会触发两次,为什么在我的更新2空白页面重定向中,pageshow事件在重定向后根本不会触发。我个人对这种行为的解释可能不正确,因为JQM呈现正文中的所有HTML,然后关注第一页。因此,第一页显示两次。给出间隔时间可以确保页面已加载并显示。我想这个操作至少需要40毫秒。虽然有比设置超时更干净的方法来完成这个操作,但我现在肯定找不到。赏金是你的@Omar@Omar图像为+1。经过一定时间后,如果获得UpVoces,则应额外获得积分。将近一年过去了,我在谷歌上搜索这个问题,在这里我找到了解决办法。只是想象一下Omar whistlin在互联网上漫步时的曲调。我添加了更多细节,以供将来参考,并解释了超时函数的用途。
$(document).on('pagecreate', "#page-formyID", function () {

//whatever

});