javascript - 重新加载 KeyDown 和 Click 事件后仅在第二次单击后有效

标签 javascript html css dom

加载/重新加载页面后,ON/OFF 按钮 上的KeyDownClick 事件仅在按下两次后才起作用,一次都没有。

虽然这只是在加载/重新加载后的第一次发生。该行为是之后的预期行为。

我试过 window.onload 没有成功。

这是相关的 JS:

//Button POWER
//event listeners
buttonEl.addEventListener("click", turnOn);
window.addEventListener("keydown", checkEnterKey);
//Storing values
var greenButton = function() {
    buttonEl.style.backgroundColor = "rgba(0, 103, 73, 0.4)";
    buttonEl.style.color = "white";
    buttonEl.textContent = "ON";
}
var whiteButton = function() {
    buttonEl.style.backgroundColor = "rgba(255, 255, 255, 0.7)"
    buttonEl.style.color = "rgb(40, 84, 45)";
    buttonEl.textContent = "OFF";
};
//function called on event
function turnOn(e) {
    if (buttonEl.textContent == "OFF") {
        greenButton();
        for (i = 0; i < keyEl.length; i++) {
            keyEl[i].style.backgroundColor = "rgba(0, 103, 73, 0.4)";
            pEl[i].style.color = "white";
        }
    } else {
        whiteButton();
        for (i = 0; i < keyEl.length; i++) {
            keyEl[i].style.backgroundColor = "rgba(255, 255, 255, 0.7)";
            pEl[i].style.color = "#2d5b3c";
        }
    }
}

function checkEnterKey(e) {
    if (e.keyCode == 13) {
        turnOn();
    }
}

整页演示:

https://jsfiddle.net/s1rwLq3m/

最佳答案

原因是您确定按钮状态的方法 (buttonEl.textContent == "OFF") 不是很安全。特别是,按钮的 textContent 最初在“OFF”文本的任一侧包含一些空白,这第一次未能通过测试。之后,文本被设置为“OFF”且没有空格,测试从那时起成功。

要快速修复,请将 buttonEl.textContent 更改为 buttonEl.textContent.trim()。但是,我建议使用适当的 bool 变量来跟踪不依赖于字符串比较的开/关状态。

关于javascript - 重新加载 KeyDown 和 Click 事件后仅在第二次单击后有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54855345/

相关文章:

jQuery:流体同位素仅在调整大小后起作用

javascript - 在 .live 函数中触发 href 事件

javascript - 如何解析 json 并根据值在 HTML 表中显示不同的颜色?

javascript - 获取元素的表父级

javascript - 如果使用 css 加载图像,如何防止显示图像替代文本

javascript - 如果库的实现未与 TS 项目集成,如何使用 d.ts 文件导出的常量类型?

javascript - 使用 JavaScript API 在谷歌驱动器中创建文件夹

javascript - Summernote createRange 与 HTML

html - 使相对元素出现在绝对元素之前同一个容器

ios - ul > li :hover . 子菜单 { 显示 : block; } - To get working on iPad?