2013-08-21 43 views
0

我遇到了让这段代码工作的问题。它的构建允许用户点击一行以通过不同类别的突出显示来“选择”它。如果另一行被点击,那个被突出显示,并且当前的一个被清除。如果一个已经被突出显示的被再次点击,它将被清除回正常状态。代理和AddClass不起作用

这是在刷新页面的ajax调用中,所以每次调用完成并插入表格的html,然后调用下面的这个函数。出于某种原因,每隔一次重新加载表格,这个工作。我跟踪了该函数结束时不能运行的$(this).addClass(s​​electedUserClass)行。我放在那里的调试控制台日志和正确的类一起工作,但下一部分由于某种原因不会添加类。

在萤火虫中,线条由..变为,但不变?我一直在看这个小时,我无法弄清楚。谢谢你的帮助!

function loadUserListener(style) { 
    if (style == "normal") { 
     selectedUserClass = 'selectedUser'; 
     selectedJQueryClass = '.selectedUser'; 
    } else { 
     selectedUserClass = 'selectedUserInverted'; 
     selectedJQueryClass = '.selectedUserInverted'; 
    } 
    console.log('setting'); 
    $("#selectuser").delegate("tr", "click", function() { 
     if ($(this).hasClass(selectedUserClass)) { 
      $(selectedJQueryClass).removeClass(selectedUserClass); 
     } else if ($(selectedJQueryClass)[0]) { 
      console.log('another'); 
      $(selectedJQueryClass).removeClass(selectedUserClass); 
      $(this).addClass(selectedUserClass); 
     } else { 
      console.log(selectedUserClass); 
      $(this).addClass(selectedUserClass); 
     } 
    }); 
} 
+1

该代码不会有所意味着你将与ID'#selectuser'多个元素,和相同的委托事件处理多次,也设置。将ID更改为类,并将委派的事件处理程序移到ajax函数之外。 – adeneo

+0

要清楚,每次调用ajax时,都会用新的表体替换旧的表体,因此不会有多个具有相同id的事物,但我将其更改为一个类,但它不起作用。我把事件处理程序移到了外面,但它仍然不起作用。 – phouse512

+0

问题明确地说,你在每个ajax调用中调用该函数,这就是为什么它每隔一段时间都会工作,因为每次添加和删除类时都会删除完全相同的事件处理程序,甚至会添加偶数次。现在你只需要弄清楚如何解决这个问题,并且看看**委托的**版本的on()将是一个好的开始。 – adeneo

回答

0

adeneo指出,有些事情对我来说,主要是听者仍然存在,即使表被刷新,所以每一个AJAX调用后,侦听器已被提上另一个导致的功能,只有作品在'甚至'电话。

我使用jquery的'off'函数在每次调用这个侦听器加载函数时清除事件处理函数。我也将代表改为更加正确。

我基本上是这样做:

$('.selectuser').off("click");