부모 요소의 이벤트가 자식 이벤트가 발생하기 전에 표시되는 내 코드의 이상한 버그를 넘어서서 내 e.stopPropagation()
이 아무 효과가 없음을 의미합니다.자식 요소가 자손 선택기에 바인딩 될 때 부모 요소에서 이벤트가 시작되는 이유는 무엇입니까?
데모 : 예상 하나의 경고를 같이 왼쪽 작품의 녹색 사각형을 클릭
$(document).ready(function() {
// Binding directly to the elements
$(".red1").on("click", function(e) {
alert("Clicked red1");
});
$(".green1").on("click", function(e) {
alert("Clicked green1");
e.stopPropagation();
});
// Binding the child from a descendant selector
$(".red2").on("click", function(e) {
alert("Clicked red2");
});
$("body").on("click", ".green2", function(e) {
alert("Clicked green2");
e.stopPropagation();
});
});
.red1,
.red2 {
display: inline-block;
width: 200px;
height: 200px;
background-color: #800;
}
.green1,
.green2 {
display: inline-block;
width: 100px;
height: 100px;
background-color: #080;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="red1">
<div class="green1"></div>
</div>
<div class="red2">
<div class="green2"></div>
</div>
- .
- 오른쪽에있는 녹색 사각형을 클릭하면 부모 이벤트가 시작되고 그 다음에 어린이 이벤트가 시작됩니다.
저는 이것이 제 부분에서 바인딩이 어떻게 작동하는지에 대한 오해로 인한 것이라고 생각하지만이 순서대로 발생하는 이유에 대해 머리를 맞지 않는 것 같습니다.
왜 이런 일이 일어 났는지 설명 할 수 있습니까?
이 있습니다. 이것은 이벤트가 발생하면'.red2'를 버블 링해야한다는 것을 의미합니다 (따라서 'parent'이벤트 핸들러가 시작됩니다). 그러면 생성자는'.green2'인지 확인하고 위임 된 이벤트 핸들러 실행됩니다. 이 문제를 피하려면 위임 된 이벤트 핸들러를 사용하지 말거나 모든 이벤트를 부모'.red' 요소에 배치하고 직접 보낸 사람을 확인하십시오. –
@RoryMcCrossan 아, 하위 클래스 선택기를 사용하는 바인딩은 부모 요소에 효과적으로 바인딩됩니다. 그런 다음 해고 될 때마다 이벤트가 발생한 위치를 확인합니다. – DBS
Rory가 말한 것에 따라 확장을 정렬하려면 녹색 div가'.red2' 내부에 있기 때문에'.red2'가 먼저 실행되지만'.green2'는 클릭 이벤트가 '
'요소로 바뀌면 "실행"됩니다. 그 전파에는 약간의 시간이 걸립니다. (많은 부분이 아니지만 차이점을보기에 충분합니다.) – Jhecht