我希望下面列出的程序的行为是这样的:
该程序的实际行为:
我有2个问题:
1)原因是什么?我只按过Enter键一次。 2)如何使该程序按我期望的方式运行?
let input = document.createElement("input");
input.value = "Click on this field and press Enter";
input.addEventListener("keydown", function(){
if(event.keyCode === 13){
let div2 = document.createElement("div");
div2.innerHTML = "Press Enter once again";
document.addEventListener("keydown", function(){
if(event.keyCode === 13){
let div3 = document.createElement("div");
div3.innerHTML = "You have pressed Enter 2 times";
document.body.appendChild(div3);
}
});
document.body.appendChild(div2);
}
});
document.body.appendChild(input);
答案 0 :(得分:1)
让我们分解一下。发生的是,您的if条件正在立即检查是否按下了该键,因此e.keyCode
始终为13
。
解决此问题的最简单方法是使用以下代码:
let input = document.createElement("input");
let isPressed = false;
input.value = "Click on this field and press Enter";
document.addEventListener("keydown", function(e) {
if (event.keyCode === 13 && isPressed) {
let div3 = document.createElement("div");
div3.innerHTML = "You have pressed Enter 2 times";
document.body.appendChild(div3);
}
});
input.addEventListener("keydown", function(e){
event.stopPropagation()
if(event.keyCode === 13){
if ( isPressed ) {
return;
} else {
let div2 = document.createElement("div");
div2.innerHTML = "Press Enter once again";
isPressed = true;
document.body.appendChild(div2);
}
}
});
document.body.appendChild(input);
您可以尝试here。您可以根据自己的喜好进行折光。 :)
请牢记原始代码,here是更新版本。
要了解该位的工作原理,方法很简单:当元素a
中有一个事件并且该元素的包装器为b
时,该事件将通过一个称为事件冒泡的过程向上传播(因为气泡上升了)。
因此,document
上的第二个事件侦听器被执行。
要阻止这种情况发生,可以在.stopPropagation()
对象上使用event
。
答案 1 :(得分:0)
这里发生了几件事。您将侦听器附加了两次,第二次附加在整个文档上,然后在事件冒泡时立即触发此事件。如果您要跟踪是否按下了回车键,则也不需要为消息使用两个不同的元素。出于安全原因,您还应该在textContent
上使用innerHTML
:)
这是重写的代码
let enterHasBeenPressed = false;
let input = document.createElement("input");
input.value = "Click on this field and press Enter";
input.addEventListener("keydown", function(){
if(event.keyCode === 13){
onEnterPressed();
}
});
document.body.appendChild(input);
let text = document.createElement("div");
document.body.appendChild(text);
function onEnterPressed() {
if (!enterHasBeenPressed) {
text.textContent = "Press Enter once again";
enterHasBeenPressed = true;
return;
}
text.textContent = "You have pressed Enter 2 times";
}