【发布时间】:2012-09-04 20:44:23
【问题描述】:
我正在创建一个 jQuery Mobile Web 应用程序,它会加载一些页面。
例如,a.html 是我的主页。它可以调用b1.html,b2.html,...,b100.html(用户可以点击其中一个按钮)。 (页面加载了 jQuery Mobile 的 ajax 导航功能)
每个b[i].html 页面和ids 中都有一些事件,每个b[i].html 页面中的许多事情都是相同的。但关键是,在任何时候,只有其中一个可能在 DOM 中。所以不会有id冲突之类的。
问题
问题是事件的冲突。当用户从b[i].html回到a.html时,HTML会被删除,但事件会保留。如果我先去b[i].html,然后再回到a.html 然后转到b[j].html。我的意思是,b[j].html 将无法正常工作... :(
我尝试过的
我已将其放入a.html,以删除所有事件:
$("#mainpage").off("pagebeforeshow").on("pagebeforeshow",function() {
$("*").not("#mainpage").off();
//Other initialization codes...
});
但是,问题没有解决……
(mainpage是a.html的data-role="page"的id)
示例
例如,我在每个b[i].html 中都有这个:
$(window).resize(function () {
alert("Resized");
});
一开始(在a.html),如果我调整窗口大小,不会有警报,但是在访问b[i].html然后回到a.html后,如果我调整窗口大小,我会看到警报,即使使用那行代码(我尝试过的部分。)...
那么,当用户从b[i].html 回到a.html 时,如何删除这些事件处理程序?
【问题讨论】:
-
使用委托事件处理程序:
$(document).on("pagebeforeshow", "#mainpage",function() { ... });。这样,只要实际元素在 DOM 中,事件处理程序就会准备就绪。 -
@Jasper 我已经试过了,但是问题依然存在...
-
如果你使用的是jQuery Mobile,dom中可能同时存在多个上述页面,导致非唯一id冲突。
-
我会放弃将 js 放在单个页面上,而是从主页或通过脚本加载系统(如 require.js)完成,然后通过文档的委托来完成所有事件。显然这不适用于 window.resize(),但无论如何也不需要委托。
-
顺便说一句,
$("*")不会选择窗口。您必须直接删除该事件。
标签: javascript jquery jquery-mobile