为啥 addEventListener 在 ES6 中工作一次? [复制]
Posted
技术标签:
【中文标题】为啥 addEventListener 在 ES6 中工作一次? [复制]【英文标题】:Why addEventListener work once in ES6? [duplicate]为什么 addEventListener 在 ES6 中工作一次? [复制] 【发布时间】:2018-10-30 12:13:14 【问题描述】:我不明白为什么 addEventListener 工作一次?
let input = document.querySelector(".send");
let i = 0;
input.addEventListener('click',(e)=>
e.preventDefault();
i+=1;
document.body.innerhtml += i;
);
<input type="submit" class="send">
【问题讨论】:
请使用有效的 javascript 修改您的问题以使其更清晰。这似乎是 HTML 和 Javascript 的混乱。 @pjb 抱歉,已编辑。 这与 ES6 无关。你甚至没有在这里使用任何 ES6,也没有class
?!
【参考方案1】:
这是因为这条线:
document.body.innerHTML
“移除”之前的 set 监听器。您实际上以这种侦听器丢失输入元素的方式更改了 html。
您可以使用 createTextNode
来解决此问题,或者使用 createElement
和 appendChild
来使用新创建的 HTML 节点:
var input = document.querySelector(".send");
var i = 0;
input.addEventListener('click',function(e)
e.preventDefault();
i+=1;
// option 1: use a new node, but in order to prevent the same innerHTML bug again use option 2 instead
//var newNode = document.createElement("span");
//newNode.innerHTML = i;
//document.body.appendChild(newNode);
// option 2 use createTextNode so that innerHTML is not used at all
document.body.appendChild(document.createTextNode(i));
);
<input type="submit" class="send">
【讨论】:
【参考方案2】:此代码将按照您希望的方式运行:
let input = document.querySelector(".send");
let result = document.querySelector("#result");
let i = 0;
input.addEventListener('click', (e)=>
e.preventDefault();
i += 1;
result.innerHTML += i;
)
<input type="submit" class="send">
<div id="result"></div>
您不应该编辑正文本身的 innerHTML。相反,请尝试定位您体内的元素。
【讨论】:
您可能根本不应该编辑innerHTML
。任何地方。
这是真的吗?我以前见过,但我也看到很多帖子说这通常没问题。有一个很好的来源说明为什么你不应该使用它?
我可能夸大了,但现在很少需要用 JS 处理原始 HTML 字符串(这可能没问题)。但是这里我们想将数字(即text)放在一个元素中,所以innerHTML
绝对应该避免。 textContent
应该是默认使用的。
我从来不知道textContent
。很有帮助,谢谢!以上是关于为啥 addEventListener 在 ES6 中工作一次? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
ES6类:在方法[复制]上应用'addEventListener'访问'this'
为啥 addEventListener 属性对动态 HTMLcollection 对象不起作用?
addeventlistener 监听storage为啥不起作用
window.addeventlistener'scroll'为啥没有效果
Javascript中..为啥IE执行addEventListener()会出错??
为啥引入 `ResizeObserver` 来监听调整大小的变化,而不是更简单的 Element.prototype.addEventListener('resize', callback)