JavaScript中的事件冒泡
Event bubbling in JavaScript
关于冒泡的定义,我似乎有些不明白。
我知道事件冒泡意味着事件从内部元素传播到外部元素。我还知道,您可以使用addEventListener()的最后一个可选参数"选择"您的传播方式。
我不明白的是:
<body>
<div id = "divi">
<p id = "para">Paragraph</p>
</div>
<script>
var elementd = document.getElementById('divi');
elementd.addEventListener("click", MessageD);
function MessageD(){
alert('A message');
}
</script>
</body>
在这里,我给div元素附加了一个click事件。默认情况下,click事件正在冒泡,这意味着它正在通过DOM向上移动。但是当我点击我的段落时,点击事件被执行。
在我看来,这意味着click事件首先传播到"p"子元素,或者向下传播到DOM。有人能给我解释一下原因和发生了什么吗?谢谢!
——在一些答案后编辑——
也许通过这个例子可以更好地解释我的困扰:
<body>
<style>
#myDiv, #results {
margin: 50px;
}
#myDiv {
padding: 10px;
width: 200px;
text-align: center;
background-color: #000;
}
#myDiv div {
margin: 10px;
background-color: #555;
}
</style>
<div id="myDiv">
<div>Text 1</div>
<div>Text 2</div>
<div>Text 3</div>
<div>Text 4</div>
</div>
<div id="results"></div>
<script>
var myDiv = document.getElementById('myDiv'),
results = document.getElementById('results');
myDiv.addEventListener('mouseover', function() {
results.innerHTML += "I'm in.<br />";
}, false);
myDiv.addEventListener('mouseout', function() {
results.innerHTML += "I'm out.<br />";
}, false);
</script>
</body>
如果你试着运行这段代码,你会"out"answers"in"的任何时候你进入和退出一个子div…这意味着你将在子div中"in"
这是否意味着事件从父级传播到子级,或者向下传播?
——最终编辑——我终于明白了:我混淆了事件和事件处理程序。
事件只是一次点击,所以页面中的任何东西都可以接收到它。单击之后,这个单击事件将转到DOM的顶部,当它遇到单击事件处理程序时,将执行与事件处理程序相关联的函数。
谢谢大家!
在我看来,这意味着click事件首先传播到"p"子元素,或者向下传播到DOM。
。在这种情况下,p
元素是事件的目标。事件传播到div
元素。div
元素有一个click
处理程序,它被执行。
事件就是这样工作的。事件的目标是触发事件的元素,目标可以是您将侦听器附加到的元素,也可以是它的子/后代之一。event
对象的target
属性指的是事件的目标元素,当addEventListener
用于附加事件侦听器时,处理程序的this
值指的是处理程序的所有者,在本例中是div
元素。
附加事件侦听器与事件的工作方式无关。每当用户单击时都会触发单击事件。作为开发人员,您需要附加一个事件侦听器来侦听为元素触发的特定事件。如果不附加侦听器,仍然会触发事件。
当您单击段落时,它不会在那里被处理,因此它会向上传播到div。如果使用此版本的代码,它会显示正在处理该事件的元素。提示是divi
,而不是para
。
var elementd = document.getElementById('divi');
elementd.addEventListener("click", MessageD);
function MessageD() {
alert(this.id);
}
<div id="divi">
<p id="para">Paragraph</p>
</div>
- 召回窗口加载事件 - javascript
- 动态创建OnClick事件Javascript
- 全局屏幕span onclick触发一个事件javascript
- 使用react js在跨域上执行事件javascript
- 在change事件javascript上动态添加行
- 在粘贴事件Javascript的输入字段中删除所有非数字字符
- 如何在多表单的输入框中使用输入事件javascript
- 无法查看特定信息.单击事件.Javascript
- 两个文本框事件Javascript
- 阻止鼠标滚轮滚动,但不阻止滚动条事件.JavaScript
- 从 onkeydown 事件 (Javascript) 获取当前用户输入
- “稍后提醒我”/“快速事件”JavaScript解决方案
- 更改我正在侦听的事件Javascript的对象的CSS
- setInterval 不允许同时单击事件 - javascript
- 对每种情况使用一个事件(JavaScript 开关)
- 仅创建第二次点击事件 Javascript
- 每 60 秒仅启动一次事件 (JavaScript)
- 如何连接来自不同文件的事件?Javascript/Backbone
- URL 更改事件 - JavaScript
- 无法在无头模式下使用 watir Webdriver 执行按钮元素的 onclick 事件 javascript