2012-05-19 112 views
0

我找不出我的代码有什么问题。 我有几个全局变量,每次按某个按钮时都会发生变化,还有一些自定义函数会执行ajax调用,它会返回大量带有下面分页的html代码,其工作原理如下:Javascript:事件重复

$('#foot #pagination a.page').live('click', function(){ 
     window.mode = 'partial';   
     window.key = $('input#search').val();   
     window.page = $(this).parent().find('input').val(); 
     setTimeout('getData();', 0);   
    }); 

有时当移动到另一个页面事件双打,我得到了加倍的HTML。调用getData()时调用 ;从浏览器控制台 - 一切工作正常,就像它必须工作。 什么能导致这种情况?

+2

**永不**将字符串传递给'setInterval()'或'setTimeout()'。这样做与使用'eval()'一样糟糕,并且只要使用变量,就会导致不可读和可能不安全的代码,因为您需要将它们插入到字符串中,而不是传递实际变量。正确的解决方案是'setInterval(function(){/ * your code *)},msecs);'。 'setTimeout()'同样适用。如果你只想调用一个没有任何参数的函数,你也可以直接传递函数名:'setInterval(someFunction,msecs);'(注意函数名后面有** no **'()') – ThiefMaster

+0

感谢您的注意 –

回答

0

的问题是,jQuery的.live()推动在文件准备一些数据jQuery的叠加,但是阿贾克斯后,响应来自服务器和文档准备事件又被称为 - 在这种情况下.live()再次将相同的数据推送到一个jQuery堆栈,然后导致多个事件正文调用。

我用.die()之前.live()和一切现在正常工作。

+1

“ajax响应来自服务器并再次调用文档就绪事件之后” - ** no **,'document.ready'不会在ajax响应中再次调用。你碰巧是从'getData'再次调用'.live',还是从它调用的其他函数中调用'.live'? – bfavaretto

+0

是的,DOM.ready加载了一堆新的事件处理程序,其中.live再次加载,你是对的,实际上这是一个错误behavour。 –

0

您只能在document.ready后执行此功能一次。 或者做这样的事情:

$('#foot').off('click', '#pagination a.page', navigation) // remove event 
      .on('click', '#pagination a.page', navigation); // add event 

function navigation(e) { 
    window.mode = 'partial';   
    window.key = $('input#search').val();   
    window.page = $(e.currentTarget).parent().find('input').val(); 
    setTimeout('getData();', 0);   
});