我已将点击事件添加到div
div.addEventListener('click', function(event) { ... });
稍后我使用innerHTML动态添加span。
div.innerHTML = "<span>some text</span>"
现在文本不可点击,这让我感到惊讶,因为我认为click事件会向上传播并触发父div上的click处理程序。发生了什么事?
我已经用jsfiddle重新创建了这个问题。我不明白发生了什么。
答案 0 :(得分:4)
没有任何神奇的事情发生,你没有看到点击事件发生,因为点击事件永远不会被解雇。原因是浏览器生成事件的行为。我引用this FIDDLE来解释会发生什么。
click-event
然后是mousedown
之后,会在元素上触发mouseup
。如果其中一个丢失,则不会执行点击。mouseover
,2)当指针在元素上移动时,3)在元素上的每个mousedown之后,以及4)在元素上每次鼠标之后。 (只要指针在元素上,Firefox另外会连续触发它,但这并不重要。)innerHTML =
删除现有的HTML并创建新的范围。在小提琴中,我在span-text中添加了一个数字,每次发生时都会增加。让我们评估当您输入div并逐步单击跨度时会发生什么:
mouseover
已触发,范围由innerHTML
创建。 范围的数字为 0 。mouseover
多次触发,每次创建新范围。让我们说我们最终得到 span20 。mousedown
。之后会立即触发mouseover
,删除 span20 并创建 span21 。释放鼠标按钮后,会在 span21 上触发mouseup
。因为在没有执行点击事件之前,该范围未收到mousedown
。鼠标识别mouseover
再次触发后,删除span21并创建span22。如果您慢慢执行操作并观察控制台,则可以轻松跟踪这些步骤。小提琴中的第二个div没有点击 - 但是mouseup
- 处理程序,并且每次释放按钮时都会发现该事件被触发。
答案 1 :(得分:1)
尝试在div上设置背景颜色,这样您就可以看到自己是否真正点击了预期的内容。我发现div通常不是我期望的那样。
答案 2 :(得分:0)
我认为你需要首先获得元素。
var div = document.getElementsByTagName("div");
div.addEventListener('click', function(event) { ... }, true);
div.innerHTML = "<span>some text</span>"
答案 3 :(得分:0)
您的代码非常接近我做了一些有效的调整
HTML:
Javascript:
//get elementsByTagName
//you have to add the [0] index in order for
//to get the div from the collection of div elements stored
//in the div variable
var div = document.getElementsByTagName("div")[0];
div.addEventListener('click', function(event) {
alert("it works");
});
div.innerHTML = "<span>Hello World</span>";
答案 4 :(得分:0)
你的问题是“鼠标悬停&#39;监听器不断触发你的div,导致不断添加新的跨度,然后再次触发它,导致你对span元素的点击不会传播。
我创建了一个小提琴,其中只添加了一次:
http://jsfiddle.net/3n5s3ez9/59/
var d = document.getElementById("hello");
var missionAccomplished = false;
d.addEventListener("click", function(event) {
alert(event);
});
d.addEventListener("mouseover", function (event) {
console.log('triggered');
if (!missionAccomplished) {
d.innerHTML = "<span>Hello World</span>";
missionAccomplished = true;
}
});
看起来像一个邪恶的循环。