javascript - if 语句在条件为假时执行
问题描述
右键单击蓝色部分将显示一个 div 元素,但如果从光标到右端和底端的高度和宽度小于 100 像素,则 div 不应显示在那里。但它正在显示。在 JavaScript 中parent.addEventListener
,我创建了一个 if 语句来执行此操作,并且提供的条件为假,因为我也在控制台中记录了它是否显示为假,但 if 语句中的代码已被执行。
var parent = document.querySelector(".parent"),
child = document.querySelector(".child"),
listItem = document.querySelectorAll("li"),
result = document.querySelector(".result");
parent.addEventListener("contextmenu", function(e) {
if ((300 >= (e.offsetX + child.offsetWidth)) && (300 >= (e.offsetY + child.offsetHeight))) {
child.style.top = (e.offsetY - 10) + "px";
child.style.left = (e.offsetX - 10) + "px";
child.style.display = "block";
console.log(300 > (e.offsetX + child.offsetWidth));
console.log(300 > (e.offsetY + child.offsetHeight));
}
console.log(
"e.offsetX: " + e.offsetX + "\n" +
"e.offsetY: " + e.offsetY + "\n" +
"child.offsetWidth: " + child.offsetWidth + "\n" +
"child.offsetHeight: " + child.offsetHeight + "\n"
)
e.preventDefault();
})
parent.addEventListener("click", function(e) {
child.style.display = "none";
})
for (let i = 0; i < listItem.length; i++) {
listItem[i].addEventListener("click", function(e) {
result.innerText = this.innerText;
})
}
* {
margin: 0;
padding: 0;
}
.parent {
background-color: blue;
width: 300px;
height: 300px;
position: relative;
}
.child {
display: none;
box-sizing: border-box;
position: absolute;
right: inherit;
top: auto;
width: 100px;
height: 100px;
margin: 10px;
padding: 0.5rem;
background-color: rgba(128, 161, 51, 0.6);
border-radius: 4px;
}
ul {
list-style-type: none;
color: white;
}
li {
background-color: rgba(128, 161, 51, 0.7);
margin: 0.25rem 0rem;
padding: 0rem 0.5rem;
border-radius: 4px;
}
li:hover {
cursor: pointer;
}
<p>Right click or long press on the blue section, then select any option.</p>
<div class="parent">
<div class="child">
<ul>
<li>Home</li>
<li>About Me</li>
<li>Contact</li>
</ul>
</div>
</div>
<div class="result"></div>
解决方案
这里的部分问题是您的代码正在检查偏移量 300,而不是问题文本中描述的 100 - 这意味着不可能触发错误条件(因为元素是 300px 正方形。)
更改代码以检查 100px 的偏移量反而表明它主要工作......但显示菜单的测试也会与菜单的offsetWidth
and进行比较offsetHeight
,当元素为 时,两者都变为零display:none
,这会导致您的计算失败。
最后,您添加的是offsetHeight
而不是按预期减去它(这似乎起作用的唯一原因是您添加的内容实际上为零。)
这是校正数学的结果,并使用visibility
而不是display
来控制是否显示子项(visibility
保持元素的原始大小不变):
var parent = document.querySelector(".parent"),
child = document.querySelector(".child"),
listItem = document.querySelectorAll("li"),
result = document.querySelector(".result");
parent.addEventListener("contextmenu", function(e) {
if ((100 >= (e.offsetX - child.offsetWidth)) && (100 >= (e.offsetY - child.offsetHeight))) {
child.style.top = (e.offsetY - 10) + "px";
child.style.left = (e.offsetX - 10) + "px";
child.style.visibility = "visible";
console.log('true')
} else {
child.style.visibility = "hidden"; // <-- If you want to make the menu disappear when clicking in an invalid location
console.log('false')
}
e.preventDefault();
})
parent.addEventListener("click", function(e) {
child.style.display = "none";
})
for (let i = 0; i < listItem.length; i++) {
listItem[i].addEventListener("click", function(e) {
result.innerText = this.innerText;
})
}
* {
margin: 0;
padding: 0;
}
.parent {
background-color: blue;
width: 300px;
height: 300px;
position: relative;
}
.child {
visibility: hidden;
box-sizing: border-box;
position: absolute;
right: inherit;
top: auto;
width: 100px;
height: 100px;
margin: 10px;
padding: 0.5rem;
background-color: rgba(128, 161, 51, 0.6);
border-radius: 4px;
}
ul {
list-style-type: none;
color: white;
}
li {
background-color: rgba(128, 161, 51, 0.7);
margin: 0.25rem 0rem;
padding: 0rem 0.5rem;
border-radius: 4px;
}
li:hover {
cursor: pointer;
}
<p>Right click or long press on the blue section, then select any option.</p>
<div class="parent">
<div class="child">
<ul>
<li>Home</li>
<li>About Me</li>
<li>Contact</li>
</ul>
</div>
</div>
<div class="result"></div>
推荐阅读
- dynamics-crm - 如何根据文本字段填充查找字段 - Dynamics 365
- spring - java.lang.IllegalStateException:节点没有数据类型:org.hibernate.hql.internal.ast.tree.IdentNode
- arrays - Scala如何从数组转换为JSON格式
- php - 如何使用 codeigniter 查询获得每个产品的平均评分?
- django - django 根据日期列表过滤查询集并获取每天的计数
- javascript - 来自 compose 函数的 Javascript Reduce
- reactjs - React Native Square 进度条等价物
- flutter - 无法在颤动的列表视图中滚动交错的网格视图
- ios - UIAlertController + UIProgressView + macCatalyst
- bash - 在循环中更改文件路径输出,在 shell 脚本中