我不熟悉JavaScript DOM,大多数情况下我使用jQuery编写脚本。.我正在尝试使用JavaScript,并遇到以下代码的麻烦。 有谁知道可能是什么问题?
我想做的是,当LI悬停时,显示嵌套的OL。某种程度上,以下代码不起作用,即使它在控制台中未显示任何错误。
请帮助我...
var ul = document.querySelector('.gnb');
var li = ul.children;
var ol = document.getElementsByTagName('ol');
var i;
for (i = 0; i < li.length; i++) {
li[i].addEventListener('mouseenter', myFunction(myshow));
li[i].addEventListener('mouseleave', myFunction(myhide));
}
function myshow() {
ol.style.display = 'block'
}
function myhide() {
ol.style.display = 'none'
}
function myFunction(fn) {
return function(e) {
if (e.target.type !== "mouseenter") return;
fn.call(e.target)
};
}
.gnb {
float: left;
margin-left: 30px;
width: auto;
height: 100%;
}
.gnb>li {
float: left;
width: 150px;
height: 100%;
list-style: none;
}
.sub {
display: none;
}
.sub.show {
display: block;
}
<ul class="gnb">
<li class="gnbLi">
<a href="#">Why Mailchimp?</a>
</li>
<li class="gnbLi" onmouseenter="myFunction()">
<a href="#">What You Can Do</a>
<ol class="sub">
<li><a href="#">Overview</a></li>
<li><a href="#">Create</a></li>
</ol>
</li>
</ul>
答案 0 :(得分:0)
您的代码不正确且不干净,我对您的代码做了一些更改:
(function () {
var ul = document.querySelector('.gnb');
var li = ul.children
var ol = document.getElementsByTagName('ol')[0];
var i;
for (i = 0; i < li.length; i++) {
li[i].addEventListener('mouseenter', myFunction(myshow));
li[i].addEventListener('mouseleave', myFunction(myhide));
}
function myshow() {
ol.style.display = 'block'
}
function myhide() {
ol.style.display = 'none'
}
function myFunction(fn) {
return fn;
}
})();
.gnb {
float: left;
margin-left: 30px;
width: auto;
height: 100%;
}
.gnb > li {
float: left;
width: 150px;
height: 100%;
list-style: none;
}
.sub {
display: none;
}
.sub.show {
display: block;
}
<ul class="gnb">
<li class="gnbLi">
<a href="#">Why Mailchimp?</a>
</li>
<li class="gnbLi">
<a href="#">What You Can Do</a>
<ol class="sub">
<li><a href="#">Overview</a></li>
<li><a href="#">Create</a></li>
</ol>
</li>
</ul>
答案 1 :(得分:0)
问题:
基本上,您所做的是将数组作为单个元素处理,因为getElementsByTagName
在整个页面中返回ol
的数组。
解决:
1.您需要将ol
内的嵌套li
使用
-event.target
获取点击的li。
-querySelector
在该ol
下获得li
。
2.您需要根据事件显示/删除ol
。
因此仅将Javascript更改为以下内容,它将起作用
var ul = document.querySelector('.gnb');
var li = ul.children;
for (i = 0; i < li.length; i++) {
li[i].addEventListener('mouseenter', mouseenter);
li[i].addEventListener('mouseleave',mouseleave );
}
function mouseenter(event) {
var ol = event.target.querySelector('ol');
if(ol){
ol.style.display = 'block';
}
}
function mouseleave(event) {
var ol = event.target.querySelector('ol');
if(ol){
ol.style.display = 'none';
}
}