jquery没有处理附加内容

时间:2012-08-21 11:16:04

标签: javascript ajax jquery ruby-on-rails-3.2

我有一个jquery函数,它在元素循环中的每个元素上显示隐藏的内容。这工作完美,但问题是当我将新元素添加到循环时它停止工作。它实际上适用于某些元素,而不适用于其他元素(奇怪的行为)。

<script type="text/javascript">
 jQuery(document).ready(function($) {

 $(".see_all").click(function(){

 if ($(this).next().css('display') == 'none'){
 $(this).next().show();

}
else

if($(this).next().is(':visible')){
   $(this).next().hide();
 }

});
})
</script>

我的jquery代码有问题吗?如何使它适用于新添加的元素和以前显示的元素。

HTML代码

   <div class="center_container">
   <%for users in @user%>
  <div class="see_all">

  <span style="color:#808080;cursor:pointer">See All Reviews(<%=@beep_count=       (@beep.opposes.count +  @beep.neutrals.count + @beep.supports.count)%>)</span>

 </div>

     <div style="display:none;" class="hidden">

      No reviews available 

     </div>
 <%end%>

 </div>

2 个答案:

答案 0 :(得分:5)

只有在使用jQ 1.7 + 时才会有效。如果你不是,请看看jQuery delegate method,它将在jQuery中实现相同的功能&lt; 1.7。但是没有理由不使用最新版本:)

这是因为在您绑定点击处理程序时:

 $(".see_all").click()

仅将绑定到与选择器.see_all匹配的当前元素

你可以做些什么来解决这个问题,使用jQuery的on()代理:

$("body").on("click", ".see_all", function() {
  //do stuff
});

此处理程序绑定到body,然后当它检测到单击时,它将查看单击的元素是否与选择器.see_all匹配。如果是,则执行该功能。因为它绑定到body,所以如果新的.see_all元素也插入到DOM中,这将有效。

如果所有.see_all都包含在一个div中,请使用该代理而非body - 纯粹作为示例使用。委托包含所有.see_all元素的第一件事。

作为旁注,您应该使用新的API .on().off()进行事件绑定,因为1.7它们已成为首选方法。 Documentation for .on()

答案 1 :(得分:2)

首先,可以使用切换进行优化。然后,您将需要一个on()事件处理程序,因为click仅绑定到文档就绪的现有元素。添加新元素时,您需要一种动态重新绑定click事件的方法。

<script type="text/javascript">
 jQuery(document).ready(function($) {

 $("body").on('click', '.see_all', function(){
  $(this).next().toggle();
});
})
</script>