【问题标题】:jQuery .each doesn't iterate over all descendantsjQuery .each 不会遍历所有后代
【发布时间】:2013-03-07 19:08:18
【问题描述】:

我尝试了几种方法,但都无法完成。

我正在设计 ul/li 的菜单。我想这样做,如果<li> 具有 href 属性,jQuery 会为其创建一个事件以重定向到该属性存储的站点。但是当没有href时,什么都不会发生。 问题是当我点击一些 li 时,同一分支中的那些也得到了事件

$("#menu-h > li li").each(function() {

      if($(this).attr("href")) {
           $(this).click(function() {
                window.location = $(this).attr("href");
                return false;
           });
      }
});

似乎each() 不会遍历#menu-h > li 之后的所有 'li',而只会遍历直系后代(子代),所以当我单击 li 内部的更多内容时,例如#menu-h > li > li,$(this ) 值存储其父级的 DOM 元素。是选择器错误的问题,还是我无法遍历所有后代,只能遍历直接后代?

【问题讨论】:

  • 试试$("#menu-h li[href]")
  • 请包含 HTML 示例
  • 事件传播。如果你点击一个元素,你也会点击它的父元素。如果你想停止传播,你需要明确地这样做
  • 我怎样才能完成它?我试过在 if 和 if 之外使用 event.stopPropagation(),但它像以前一样工作或完全停止事件(即使单击右侧 li 后也不重定向)

标签: jquery jquery-selectors each


【解决方案1】:

无需遍历每个元素并添加点击事件处理程序,您可以使用选择器li[href] 找到所有具有href 属性的lis。

$(function(){
    $("#menu-h li[href]").click(function() {
        if($(this).attr("href")) {
            window.location = $(this).attr("href");
            return false;
        }
    });
});

更好的解决方案是使用事件委托

$("#menu-h").on('click', 'li[href]', function() {
    if($(this).attr("href")) {
        window.location = $(this).attr("href");
        return false;
    }
});

【讨论】:

  • 这很有帮助,但没有解决它:/ 但我发现了问题:我在前一个“li”中使用下一个菜单“ul”,所以如果我点击,jQuery 会运行事件里面还有一些 li - 从技术上讲,它仍然是以前的 li 区域。有没有办法阻止它?我使用 position: absolute,所以 ul 实际上在父 li 之外。
猜你喜欢
  • 1970-01-01
  • 2014-10-07
  • 2019-04-10
  • 2010-12-26
  • 2013-11-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多