我正在使用可点击的下拉菜单进行导航。下拉列表使用输入标记。我陷入困境的地方是,如果访问者单击页面上的其他地方,我需要关闭下拉列表。我正在尝试使用目标属性、matches()方法和onclick事件。
我在控制台中注意到的是,当我打开下拉列表时,两个条件语句都出现了,下拉列表没有打开。这就好像下拉列表同时打开和关闭。
我做错了什么?我如何让它正常工作,以便用户只需打开下拉菜单,并在单击网页上的其他位置时将其关闭?
提前谢谢!下面是代码。这是代码笔:https://codepen.io/bfoley650/pen/NWxeXRB?editors=1111
HTML
<div class="dropdown">
<input id="checkId" type="checkbox" name="menu" />
<label for="checkId">
<span class="heyhey">⋮</span>
</label>
<div class="dropdown-content">
<ul class="heyheyhey">
<li><a href="#">Item 1</a></li>
<li><a href="#">Item 2</a></li>
<li><a href="#">Item 3</a></li>
<li><a href="#">Item 4</a></li>
</ul>
</div>
</div>
CSS
span {
color: black;
font-size: 24px;
margin: 0 15px;
}
li {
list-style-type: none;
}
.dropdown {
float: left;
overflow: hidden;
font-size: 17px;
border: none;
outline: none;
color: white;
background-color: inherit;
font-family: inherit;
margin: 10px 0;
}
.dropdown-content {
display: none;
position: absolute;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}
.dropdown-content a {
float: none;
color: black;
padding: 12px 20px 12px 0;
text-decoration: none;
display: block;
text-align: left;
}
input {
display: none;
}
label {
position: relative;
cursor: pointer;
}
input:checked~.dropdown-content {
display: block;
}
JS
let el = document.querySelector(".dropdown-content");
window.onclick = function(e) {
if (e.target.matches(".heyhey")) {
console.log("You clicked the dropdown menu");
} else {
console.log("You clicked somewhere else");
el.style.display = "none";
}
}
我认为您应该将跨度移到标签上方:
<span class="heyhey">⋮</span>
<label for="checkId">
<input id="checkId" type="checkbox" name="menu" />
</label>
并将以下代码添加到条件中:
console.log("You clicked the dropdown menu");
el.style.display = "block";
window.onclick = function(e) {
if (e.target.matches(".heyhey")) {
console.log("You clicked the dropdown menu");
el.style.display = "block"; // Shows the element
e.preventDefault(); // Prevents propagation
} else {
console.log("You clicked somewhere else");
el.style.display = "none";
}
}
事件。preventDefault
停止传播,JS默认调用父元素的onclick
,这将停止对onclick
处理程序的重复计数。
这将更改show
样式,从而显示元素。这可以更改为任何其他显示样式,除了no
。
我试图创建下拉菜单,点击打开。这是通过添加类到class elements,基本上显示菜单。到目前为止,一切正常,但我真的不明白当用户单击打开的菜单之外的任何地方时,如何关闭打开的下拉菜单。到目前为止,我的代码如下所示: 注意:当用户单击打开的菜单时,该菜单不应关闭。只有当用户在打开的菜单外单击时,它才应关闭。 我如何使用普通的Javascript做到这一点?感谢任何帮助。
问题内容: 我有一个Twitter Bootstrap下拉菜单。正如所有Twitter Bootstrap用户所知,单击(甚至在其中单击)时,关闭菜单。 为避免这种情况,我可以轻松地在下拉菜单上附加一个click事件处理程序,只需添加著名的即可。 但是,这看起来很简单,而且是非常普遍的行为,而且由于(以及)事件处理程序都委派给了对象,因此这些元素(上 一个/下一个 控件,…)上的事件将被“忽略”。
我有一个Twitter引导下拉菜单。正如所有Twitter引导用户都知道的那样,下拉菜单会在点击时关闭(甚至在其中点击)。 为了避免这种情况,我可以很容易地在下拉菜单上附加一个click事件处理程序,并简单地添加著名的。 但是,这看起来很简单,也是一种非常常见的行为,而且由于(以及)事件处理程序被委托给对象,因此这些元素(Prev/Next controls,...)上的事件将被“忽略”。 依赖T
问题内容: 当用户单击下拉菜单之外的任何地方时,我想关闭我的登录菜单下拉菜单,我想使用Angular2和Angular2“方法”来完成此操作… 我已经实现了一个解决方案,但是我对此确实没有信心。我认为必须有一种最简单的方法来达到相同的结果,因此,如果您有任何想法…让我们讨论一下:)! 这是我的实现: 下拉组件: 这是我的下拉菜单的组成部分: 每次将此组件设置为可见时,(例如:当用户单击按钮以显示它
这是点击事件。 这是xml 结果将显示在片段中,但抽屉菜单仍然显示。我该怎么做才能关闭它?任何人都给我建议,如何解决这个问题,任何帮助非常感谢。谢谢你。
我试图隐藏我的下拉框,当用户点击它的打开状态之外,我使用一个标志,确定菜单是否打开,然后我在文档上添加了一个点击事件来隐藏菜单,如果如果单击菜单,则打开并停止菜单上的分配。但是现在,当我单击我的下拉锚标记时,文档单击事件被触发。有人能告诉我如何解决这个问题吗? JS