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上的旧事件

NLog 不会删除旧文件

UICollectionView reloadSection 不会从视图层次结构中删除旧视图

DataSource 更改时,ComboBox 不会自动更新?

使用 Overwrite 模式时 Spark 不会删除 MemSql 中的旧数据