繁体   English   中英

防止在错误的元素上发生默认值,并且 mouseleave/mouseout 给出不一致的响应

[英]prevent default occurring on wrong element and mouseleave/mouseout give inconsistent response

我试图制作一个可行的片段,但这是在 wordpress 中完成的,目前无法。

这就是我们正在尝试做的事情。 我们有一个包含 5 个项目的菜单。 这些显示在 inline-block 中。 在五个项目中的两个上,我们有一个以块显示的子菜单。 对于这两个项目,我们希望禁用单击事件,但仍然有鼠标悬停工作,并且在鼠标悬停时显示子菜单并更改导航栏的底部边距。 点击事件需要对子菜单项起作用。 在 mouseleave 上,我们需要将下边距改回 0px。

菜单结构如下:

<div class="navbar">
   <ul class="main-menu">
      <li><a href="https:\\google.com">Home</a></li>
      <li class="aboutUs">About Us
         <ul class='sub-menu'>
            <li><a href="https:\\yahoo.com">Home</a>Our Story</a></li>
            <li><a href="https:\\yahoo.com">SWAG Leaders</a></li>
            <li><a href="https:\\yahoo.com">In The News</a></li>
          </ul>
</li>
      <li><a href="https:\\google.com">Our Work</a></li>
      <li><a href="https:\\google.com">Calendar</a></li>
      <li class="takeAction">Take Action
         <ul class='sub-menu'>
            <li><a href="https:\\yahoo.com">Home Improvement</a></li>
            <li><a href="https:\\yahoo.com">Get Involved</a></li>
            <li><a href="https:\\yahoo.com">Resources</a></li>
            <li><a href="https:\\yahoo.com">Donate</a></li>
          </ul>
</li>
</div> 

这是JS:

function moveDown(event){                    
const submenus = document.getElementsByClassName('sub-menu')                      
//var vision = document.getElementsByClassName('home-vision')[0]   
var vision = document.getElementById("navbar");


var sub     

    if(event.target.innerHTML === "About Us"){
        sub=submenus[0]
    }else{
        sub=submenus[1]
    }

var rect = sub.getBoundingClientRect();         
vision.style.marginBottom = rect.height + "px"      
}


function moveUp(event){ 
//var vision = document.getElementsByClassName('home-vision')[0] 
var vision = document.getElementById("menu-1");
vision.style.marginBottom = 0   
}


(function(){


var aboutUs = document.getElementsByClassName('aboutUs')[0] 
var takeAction = document.getElementsByClassName('takeAction')[0] 

aboutUs.addEventListener("click", function(event){
event.preventDefault()
})

takeAction.addEventListener("click", function(event){
event.preventDefault()
})      

aboutUs.addEventListener('mouseover', function(event) {moveDown(event)},{passive: false})
takeAction.addEventListener('mouseover', function(event) {moveDown(event)},{passive: false})  

aboutUs.addEventListener('mouseleave', function(event) {moveUp(event)},{passive: false})
takeAction.addEventListener('mouseleave', function(event) {moveUp(event)},{passive: false})     
})()

这是该网站的链接

以下是具体问题:

1) 阻止默认单击操作的侦听器位于主菜单元素“关于我们”和“采取行动”上,但阻止了子菜单上的操作,而不是主菜单元素

2)mouseleave 假设仅在您离开元素或内部元素时才起作用。 这似乎适用于“采取行动”,而不是“关于我们”,它看起来就像一个鼠标悬停事件。

我正在尝试提供一个工作示例。 这是一个非常好的事业,非常感谢您的帮助。

更新:

看这段代码:

<li class="aboutUs">About Us
         <ul class='sub-menu'>
            <li><a href="https:\\yahoo.com">Home</a>Our Story</a></li>
            <li><a href="https:\\yahoo.com">SWAG Leaders</a></li>
            <li><a href="https:\\yahoo.com">In The News</a></li>
          </ul>
</li>

我们想要禁用点击“关于我们”(这不是一个链接),但仍然在 ul 子菜单上启用点击

在这部分代码中

aboutUs.addEventListener("click", function(event){
    event.preventDefault()
})

您可以检查 event.target 并验证它是正确的点击以防止类似

aboutUs.addEventListener("click", function(event){
    if(event.target.innerText === "About Us") {
         event.preventDefault()
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM