2013-03-19 53 views
-1

我试过几种方法,但只是无法完成。jQuery。每个不遍历所有后代

我正在设计ul/li的菜单。我想这样做如果<li>具有href属性,jQuery会创建一个事件让它重定向到该属性存储的站点。但是当没有href时,没有任何反应。 问题是当我点击了一些利,在同一分支的人也越来越事件

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

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

看来,each()不遍历所有“里的#menu-h > li后,但仅限于直接后代(子),所以当我点击里面的更多内容时,比如#menu-h > li > li,$(this)存储它的父元素的DOM元素。这是错误的选择器的问题,还是我不能遍历所有的后代,只有直接的?

+0

尝试'$( “#菜单-H利[HREF]”)' – 2013-03-19 07:41:36

+0

请包括HTML – Boaz 2013-03-19 07:42:09

+0

事件传播的一个样本。如果你点击一个元素,你也可以点击它的父母。如果你想停止传播,你需要明确地做到这一点 – 2013-03-19 07:43:19

回答

0

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

$(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; 
    } 
}); 
+0

这帮了很多,但没有解决它:/但我发现问题:我在前面的“li”中使用了下一个菜单“ul”,所以如果我点击其他里面的内容,jQuery就会运行这个事件 - 从技术上讲,它仍然是前面的li区域。有没有办法阻止它?我使用position:绝对的,所以ul的实际上在父母之外。 – 2013-03-19 08:18:53