pageChange 不会删除旧事件
Posted
技术标签:
【中文标题】pageChange 不会删除旧事件【英文标题】:pageChange doesn't remove old events 【发布时间】:2012-12-16 23:59:42 【问题描述】:我在使用 jQuery mobile 时遇到了很多问题,我真的很想开枪打死自己。
我有一个带有此代码的页面:
$(document).on('pageinit ',function()
$("#phone_number").on("blur", function (event, ui)
$.mobile.changePage("<?php echo base_url(); ?>mobile/products_by_phone",
type: "POST",
data: phone : $('#phone_number').val() ,
transition: "flip" );
);
);
现在页面具有有效的 html 和 jQuery mobile 标记,其中包含以下代码:
$(document).on('pageinit ',function()
alert();
);
现在,当我更改页面时它可以工作,但是当我再次调用 blur
事件时,页面更改了两次,然后我再做 4 次,然后是 8 次,等等。
并且按下浏览器的后退按钮有效,但是当我尝试向前按下时没有任何反应。
注意事项:
我认为这可能与模糊有关,并且每次 changePage 发生模糊触发时,我尝试添加一个按钮并绑定到单击,但同样的事情发生了 我认为可能是我绑定到document
的事实导致它,所以我尝试绑定到页面 id 但根本不起作用(没有任何事件发生,因为没有绑定事件),然后我尝试触发一个创建事件,但也没有绑定事件
为什么会这样?
【问题讨论】:
【参考方案1】:你所要做的就是添加你想要绑定 init 事件的页面...假设你想要这个绑定一次,你这样做,你只需要更具体。
例子:
$(document).on('pageinit', '#page1', function(e)...);
将 #page1 替换为您的页面 ID。
【讨论】:
【参考方案2】:我不熟悉 jQuery mobile,但我假设 changePage()
函数使用 AJAX 调用加载新页面内容。如果是这种情况,那么现有的事件处理程序将保留,您每次只需添加更多的事件处理程序。
尝试使用.off()
函数在(重新)绑定之前删除事件处理程序。
【讨论】:
【参考方案3】:这是一个常见的 jQuery 移动问题。这是因为多个事件绑定到同一个元素。每次返回上一页时,都会再次绑定相同的事件。
这个问题有两种解决方案。
在将事件绑定到某个元素之前,请检查同一事件是否尚未绑定。
示例:
$('.menu-browse:Event(!' + touchEvent + ')').each(function()
$('.menu-browse').bind(touchEvent, function(e)
);
);
您将在此处找到事件过滤器的完整实现:http://www.codenothing.com/archives/2009/event-filter/
或者:
每次绑定事件时,先解除绑定。
示例:
$(document).unbind();
$(document).bind('pageinit', function(e)
);
或:
$(document).die();
$(document).live('pageinit', function(e)
);
或者在你的情况下:
$(document).off();
$(document).on('pageinit',function()
alert();
);
遗憾的是,对于这个问题没有万无一失的解决方案。
【讨论】:
嗯,第一个是给我Syntax error, unrecognized expression: unsupported pseudo: Event
和 off 和 die 都不起作用,同样的事情正在发生,这仍然不能回答为什么前进按钮不起作用。如果它在新页面中很重要,我的事件也不会被绑定......以上是关于pageChange 不会删除旧事件的主要内容,如果未能解决你的问题,请参考以下文章
Worklight 或 jQuery Mobile 意外抛出“pagechange”事件
jQuery fullCalendar删除document.ready上的旧事件
UICollectionView reloadSection 不会从视图层次结构中删除旧视图