jQM在关闭对话框或导航回来时,再次触发事件

Posted

技术标签:

【中文标题】jQM在关闭对话框或导航回来时,再次触发事件【英文标题】:jQM when closing dialog or navigating back, the event gets triggered again 【发布时间】:2012-09-24 10:36:25 【问题描述】:

我正在使用 jQuery Mobile 制作移动应用程序。进展顺利,但有一个主要问题我无法解决。

我有一个包含多个页面的 index.html (data-role=page)。因为我传递参数,所以我在我的 javascript 中使用点击事件调用这些页面。这些页面由从 json 文件(基于参数)创建(live pagebeforeshow)的列表视图组成。 例如,在类别页面上,您单击某个类别,它的 ID 会传递到下一页,该页面会在新列表中显示该类别的子类别。

现在奇怪的是,当我单击后退按钮或关闭对话框时,打开该页面或该对话框的单击事件通常会再次自动触发,但并非总是如此。 例如,您单击列表中的一个项目。点击事件触发一个对话框弹出。你关闭对话框,列表(上一页)被重新加载,然后对话框立即再次弹出,好像点击事件再次被触发......很奇怪。

我不知道。

这是我用来告诉浏览器获取 json 并显示我需要的内容的事件示例。

$('#dialog_zin_nl').live('pagebeforeshow', function(event, data) 

*这里是该页面上必须发生的所有代码,例如获取正确的 json 内容并将其附加到 html...

在那之后(在这个'pagebeforeshow'内)我声明我的按钮点击事件像这样

$("#execute_sub_rubriek").on("click", ".selected_zin_nl", function(event)
                    var selected_zin_nl  = $(this).attr('selected-zin-nl');
                    $.mobile.changePage( "#dialog_zin_nl?current_rubriek=" + current_rubriek_id + "&current_sub_rubriek=" + current_sub_rubriek_id + "&current_zin=" + selected_zin_nl + "",  role: "dialog" );
                  );

如果有人遇到过同样的问题或知道出了什么问题。请解释一下。

谢谢!

EDIT 如果我使用 pageinit 我没有这个问题。虽然我不能使用 pageinit,因为当用户选择另一个类别时,必须刷新页面的内容。

我的一个想法:如果页面被后退按钮调用,是否可以调用pageinit,如果页面被另一个按钮调用,是否可以调用pagebeforeshow?

【问题讨论】:

【参考方案1】:

您在事件pagebeforeshow 中添加了一个on 侦听器,并且由于pageshow 在您导航回页面时触发,它将添加一个第二个 on 侦听器,这就是原因您的代码行为异常。

您需要将 pageinitpageshow 代码分开,仔细考虑 pageinit 应该只初始化一个页面,每次查看页面时都会调用 pageshow,所以如果您有动态内容,您应该在那里刷新您的 DOM,但是将您的 on 听众附加到您的 pageinit 中,这样它只会发生一次。

这里有一个类似问题的链接,它强调了我们如何在 jQM 网站上清理我们的 JS:https://***.com/a/9368352/737023 - 如果你以这种方式组织它会更有意义 - 特别是跟踪什么时候触发以及什么运行什么时候。

【讨论】:

以上是关于jQM在关闭对话框或导航回来时,再次触发事件的主要内容,如果未能解决你的问题,请参考以下文章

在对话框外发生单击时如何触发事件

如何强制 jQuery UI 对话框再次重绘或触发某些东西来强制调整大小

关闭弹出窗口并导航到 jQuery Mobile 中的另一个页面

关闭浏览器事件 onbeforeunload和onunload

Winforms:在对话框外单击时关闭模式对话框

关于WinForm中对话框MessageBox的问题