gpt4 book ai didi

javascript - 使用 bool 值的 eventListener 运行两次(Javascript 和 CSS)

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:56 25 4
gpt4 key购买 nike

我正在尝试使用 Javascript 和 CSS 转换来制作效果。假设我有 2 个 DIV,一个不会显示(我称之为“hiddy”),另一个(“showy”)将有 1 个按钮。当我按下那个按钮时,我想转换“showy”,然后显示“hiddy”,并创建一个不透明度为 0 的新 DIV,它将覆盖“showy”,并将具有一个 onclick 函数,这将导致“hiddy”不显示和“showy' 返回到它的初始状态,并删除我们创建的 DIV。

我试图通过使用“propertyName === transform”的“showy”上的 eventListener 和带有 bool “status”的 if 语句来执行此操作,但它不起作用。

第一次运行它时,它工作得很好,它会激活监听器一次, bool 值为 true,进行转换并创建 div,然后当您单击新的 div 时,它会触发监听器, bool 值为 false .现在问题来了,如果你再次点击按钮,它应该再次调用函数 trans(),监听器将运行两次,即使状态在任何 eventListener 中都没有改变它的值,当我们点击按钮时它会改变(它是初始化或设置为 true)或者当我们点击新的 div 时(它变为 false)。

感谢您的宝贵时间。

var iteration = 0;
function trans() {
if(typeof status === 'undefined'){
var status = true;
}
else {
status = true;
}

var hiddy = document.getElementById('hiddy');
hiddy.classList.add('active');
var showy = document.getElementById('showy');
showy.classList.add('transformRight');

showy.addEventListener('transitionend', function(e) {
if(e.propertyName === 'transform') {
iteration++;
console.log('Iteration number: '+iteration);
console.log('Status value --> '+status);

if (status) {
console.log('Status was true');
var meh = document.createElement('div');
meh.id = 'layer';
showy.appendChild(meh);
layer = document.getElementById('layer');
layer.classList.add('layer');
layer.onclick = function () {
status = false;
showy.classList.remove('transformRight');
showy.classList.add('transformLeft');
showy.removeChild(layer);

}
}

if (!status) {
console.log('Status was false');
hiddy.classList.remove('active');
showy.classList.remove('transformLeft');
}

}
},false);

}

var iteration = 0;
function trans() {
if(typeof status === 'undefined'){
var status = true;
}
else {
status = true;
}

var hiddy = document.getElementById('hiddy');
hiddy.classList.add('active');
var showy = document.getElementById('showy');
showy.classList.add('transformRight');

showy.addEventListener('transitionend', function(e) {
if(e.propertyName === 'transform') {
iteration++;
console.log('Iteration number: '+iteration);
console.log('Status value --> '+status);

if (status) {
console.log('Status was true');
var meh = document.createElement('div');
meh.id = 'layer';
showy.appendChild(meh);
layer = document.getElementById('layer');
layer.classList.add('layer');
layer.onclick = function () {
status = false;
showy.classList.remove('transformRight');
showy.classList.add('transformLeft');
showy.removeChild(layer);

}
}

if (!status) {
console.log('Status was false');
hiddy.classList.remove('active');
showy.classList.remove('transformLeft');
}

}
},false);

}
.showy {
display:none;
background-color: red;
width: 200px;
height: 200px;
z-index: 3;
}

.showy.active {
display:block;
}

.hiddy {
display:none;
background-color: blue;
width: 200px;
height: 200px;
z-index: 1;
}

.hiddy.active {
display:block;
}

.transformRight {
transform: translate(50%);
transition: transform 1s linear 0s;
}

.transformLeft {
transform:translate(0%);
transition: transform 1s linear 0s;
}

.layer {
position: fixed;
max-width: 100%;
max-height: 100%;
margin-left: 0px;
top: 0px;
height: 100vh;
width: 100vw;
z-index: 8;
opacity: 0.4;
background-color: yellow;
}

.active {
display:block;
}
<!doctype html>
<html>
<head>
</head>
<body>
<div id="showy" class="showy active"><button type="button" onclick="trans()">Button</button></div>
<div id="hiddy" class="hiddy"></div>

</body>

</html>

最佳答案

好的,我找到了解决方案。

完成后删除 eventListener 就可以了。

if (!status) {
console.log('Status was false');
hiddy.classList.remove('active');
showy.classList.remove('transformLeft');
showy.removeEventListener('transitionend', arguments.callee, false);
}

在此找到了如何从“内部”删除一个 eventListener post .

关于javascript - 使用 bool 值的 eventListener 运行两次(Javascript 和 CSS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43516002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com