gpt4 book ai didi

Javascript AddEventListener 只触发一次

转载 作者:行者123 更新时间:2023-11-28 04:03:03 25 4
gpt4 key购买 nike

我有以下 HTML

...
<div class="content-row"><div class="col-md-4"></div>
<div class="col-md-4">
<form>
<div id='undiv' class="form-group"><label for="uname">Name:</label><input id="uname" type="text" class="form-control"/></div>
<div class="form-group"><label for="email">Email (optional):</label><input id="email" type="text" class="form-control" /></div>
<div class="form-group"><label for="gamecode">Game Code:</label><input id="gamecode" type="text" class="form-control" /></div>
<div class="form-group pull-right"><input id="join" type="button" value="Join" class="btn btn-primary btn-lg btn btn-primary btn-lg" /></div>
</form>
</div><div class="col-md-4"></div>
</div>
....

body 中 HTML 下方的 Javascript

<script type='text/javascript'>
var uname = document.getElementById("uname");
var email = document.getElementById("email");
var gamecode = document.getElementById("gamecode");
var joinbtn = document.getElementById("join");
var notify = document.getElementById("notify");
var undiv = document.getElementById("undiv");
...


uname.addEventListener("blur",function(evt) {
console.log('onblur');
var un = uname.value;
console.log(un);
if(un.length >= 2) {
undiv.className += " has-success has-feedback";
undiv.innerHTML += '<span id="mark" class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>';
}
else {
undiv.className += " has-error has-feedback";
undiv.innerHTML += '<span id="mark" class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>';
}
//uname.value = un;
});

uname.addEventListener("focus",function(evt) {
console.log('onfocus');
undiv.className = "form-group";
var mark = document.getElementById("mark");
if(mark !=null) {
mark.parentNode.removeChild(mark);
console.log("mark="+mark);
}
});
</script>

onfocusonblur 事件上的 uname 只触发一次。

我在按钮点击事件上有另一个eventListener,它工作正常。

我不明白为什么 focusblur eventListeners 不会在事件发生时触发?

Chrome 和 Firefox 上的调试器没有显示任何错误或警告...而且我不明白出了什么问题?

http://jsfiddle.net/ddf5h2nu/

最佳答案

一个好的做法是在你的 table 上放一把尺子,如果你发现自己在打字 element.innerHTML += "...",就拿起尺子拍打你的手背.

;-)

说真的,在 .innerHTML 之后使用 += 是非常具有破坏性和不必要的,正如您所看到的会导致意想不到的结果。

另一个答案显示了如何使用 DOM 创建方法来实现,这是一个好方法,但是如果您想使用 HTML 标记,请使用 .insertAdjacentHTML() 而不是 .innerHTML

uname.addEventListener("blur",function(evt) {
console.log('onblur');
var un = uname.value;
console.log(un);
if(un.length >= 2) {
undiv.className += " has-success has-feedback";
undiv.insertAdjacentHTML("beforeend", '<span id="mark" class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>');
}
else {
undiv.className += " has-error has-feedback";
undiv.insertAdjacentHTML("beforeend", '<span id="mark" class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>');
}
//uname.value = un;
});

您会注意到第一个参数是 "beforeend",第二个是您的 HTML。 .insertAdjacentHTML() 方法接受四个不同的字符串作为第一个参数。它们如下:

  • “beforebegin” (将标记放在元素之前)
  • "afterbegin" (将标记放在元素的开头)
  • "beforeend" (将标记放在最后的元素内)
  • "afterend" (将标记放在元素之后)

因此相对于调用该方法的元素,有四个位置可以插入 HTML。这些不会破坏任何现有元素,这就是它比 .innerHTML 更好的原因。

关于Javascript AddEventListener 只触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28441798/

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