2013-07-03 123 views
5

我有一些JavaScript,我继承了我的工作。在这个JavaScript中,我们有一个不断更新的边栏(每隔1到10分钟)。在脚本中,我们解析并处理来自服务器的AJAX,然后调用一个有趣的函数。Javascript事件监听器刷新

function renewClicks(){ 
    $('.classElem').unbind('click'); 
    $('.classElem2').unbind('click'); 
    $('.classElem3').unbind('click'); 

    $('.classElem').click(elm1funct); 
    $('.classElem2').clikc(elm2funct); 
    $('.classElem3').click(elm3funct); 
} 

其中.classElem是附加到添加到页面的每个图像的css类选择器。而elmfunct是一个用于处理点击的函数。这会在每次更新时运行(取消授权有效的已添加元素,然后重新添加全部元素)。我想知道是否有一种方法可以将侦听器附加到DOM中的body元素上,这样所有添加到页面中的图像元素和继承css类的图像元素都将被处理,因此不会被注销,每次更新都注册。

谢谢你提供的任何信息。

+2

您应该使用委托,使用jQuery的on方法来处理这个问题,以便您不必保持解除绑定/重新绑定这些点击。没有看到你的HTML代码,很难再告诉你更多。 – crush

回答

8

你可以试试这个:

$('body').on('click','.classElem',elm1funct) 
     .on('click','.classElem2',elm2funct) 
     .on('click','.classElem3', elm3funct); 

jQuery's docs

授权事件的优点是他们可以处理事件 后代ele稍后添加到文档中的内容。通过 采摘这是保证出席 委派的事件处理程序连接时的元素,你可以使用委派事件 避免需要频繁安装和取下事件处理程序。

+0

这对于任何给定时间页面中存在的每个实例都适用?所以,让我们说我有一个放大镜图标,我将它添加到13个div元素。每个放大镜是否都分配了正确的事件处理程序?我只是想彻底。 –

+0

是通过对''body'','document'或这些元素的祖先应用'.on()',点击指定的功能将适用于与您的类选择器匹配的所有元素,甚至是新的元素 – DarkAjax

+0

为了的性能,委托的事件处理程序应尽可能地附加到目标('。classElem'等)。如果目标'.classElem'将始终位于ID为myDiv的div内,请使用'(''click','.classElem',elm1funct)''('#myDiv')。 – Sinjai

7

正如@crush提到的,使用事件委托方式,以避免解除绑定并重新绑定事件:

$(document).on('click', '.classElem', elm1funct);