$(this).find(..)替代

时间:2013-01-08 14:52:06

标签: javascript jquery html

我发现自己这样做但不确定这是否是最佳方式。这是一个例子。

<ul id="menubar">
  <li><a class="menu_item">File</a>
    <ul>
      <li><a id="menu_file_new">New</a></li>
      <li><a id="menu_file_open">Open</a></li>
    </ul>
  </li>
  <li><a class="menu_item">Run</a>
    <ul>
      <li><a id="menu_run_preview">Preview</a></li>
      <li><a id="menu_run_compile">Compile</a></li>
    </ul>
  </li>
</ul>

JQuery的

$('.menu_item').hover(function(){
    $(this).find('ul').show();
});

只是想知道这是最好的方法,发现有点矫枉过正吗?


编辑:由于这个原因,我无法使用css:当点击某个项目时,Opera / IE中出现故障/悬停在这两个浏览器中失败。 http://jsfiddle.net/cJsn2/1/这是因为html标准。

5 个答案:

答案 0 :(得分:2)

您只能使用CSS

.menu_item ul { display: none; }
.menu_item:hover ul {display: block; }

对于JavaScript,没关系,您可以使用$ .children而不是$ .find来遍历更少的节点

答案 1 :(得分:1)

您要使用的是closest。它向上移动DOM树以找到与选择器匹配的第一个父元素:

$('.menu_item').hover(function(){
    $(this).closest('ul').show();
});

$(".menu_item").hover(function() {
    $(this).next().show();
});

答案 2 :(得分:1)

尝试使用css

问题是你要在 li 上应用“悬停”而不是 a

#menubar li ul{ 
  display:none; 
}

#menubar li:hover > ul{ 
  display:block; 
}

jsfiddle >

答案 3 :(得分:1)

这将是一个简单的悬停脚本:

// I'm purposely using `toggleClass`, instead of show/hide, to
// have more flexibility with styling
$('.menu_item').each(function () {
  var $li = $(this).closest('li');

  $(this).hover(function () {
    $li.toggleClass('hover');
  });
});

使用以下css:

ul ul {
  display: none;
}

li.hover > ul {
  display: block;
}

演示:http://jsbin.com/ehifod/1/

答案 4 :(得分:0)

您可以使用CSS(假设ul元素中包含.menu_item元素):

.menu_item:hover > ul {
   display: block;
}

演示:http://jsfiddle.net/maniator/cJsn2/

使用以下HTML:

<ul id="menubar">
  <li class="menu_item"><a>File</a>
    <ul>
      <li><a id="menu_file_new">New</a></li>
      <li><a id="menu_file_open">Open</a></li>
    </ul>
  </li>
  <li class="menu_item"><a>Run</a>
    <ul>
      <li><a id="menu_run_preview">Preview</a></li>
      <li><a id="menu_run_compile">Compile</a></li>
    </ul>
  </li>
</ul>