javascript - 为什么 jQuery 不能处理附加内容?

标签 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>

最佳答案

这仅在您使用 jQ 1.7+ 时才有效。如果你不是,看看 jQuery 的 delegate method ,这将在 jQuery < 1.7 中实现相同的效果。不过,没有理由不使用最新版本:)

这是因为当您绑定(bind)点击处理程序时:

 $(".see_all").click()

绑定(bind)到与选择器.see_all匹配的当前元素。

要解决这个问题,您可以使用 jQuery 的 on() 进行委托(delegate):

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

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

如果所有 .see_all 都包含在一个 div 中,请使用它来委托(delegate)而不是 body - 仅用作示例。委托(delegate)包含所有 .see_all 元素的第一个事物。

顺便说一句,您应该使用新的 API .on().off() 进行事件绑定(bind),从 1.7 开始它们已成为首选方法。 Documentation for .on() .

关于javascript - 为什么 jQuery 不能处理附加内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12053656/

相关文章:

php - Laravel 5 : Handle exceptions when request wants JSON

javascript - 如何使用 jquery 从 json 对象中获取值?

javascript - JQuery Bootstrap 日期选择器验证错误未显示

javascript - 对对象键/值使用多个映射类型。只需要联合的一个值?

php - 使用 AJAX 从页面上的日志文件重新加载内容

javascript - 如何使用 jQuery 将文本附加到 div?

javascript - contains() 始终返回 true

javascript - 自动打开 btn-group 下拉列表并选择第一个元素

jquery - 悬停行时显示/隐藏行中的元素

javascript - D3 Canvas 强制布局 - 脱节组排斥另一组