클래스가있는 DIV가 foobar
있고 해당 DIV 내부에 클래스 가없는 몇 가지 DIV가 있지만 foobar
클래스를 상속한다고 가정합니다 .
$('.foobar').on('click', function() { /*...do stuff...*/ });
DIV의 어딘가를 클릭 할 때만 실행되고 자식 DIV는 실행하지 않기를 원합니다.
클래스가있는 DIV가 foobar
있고 해당 DIV 내부에 클래스 가없는 몇 가지 DIV가 있지만 foobar
클래스를 상속한다고 가정합니다 .
$('.foobar').on('click', function() { /*...do stuff...*/ });
DIV의 어딘가를 클릭 할 때만 실행되고 자식 DIV는 실행하지 않기를 원합니다.
답변:
가와 (과 e.target
) 같은 요소 인 this
경우 자손을 클릭하지 않은 것입니다.
$('.foobar').on('click', function(e) {
if (e.target !== this)
return;
alert( 'clicked the foobar' );
});
.foobar {
padding: 20px; background: yellow;
}
span {
background: blue; color: white; padding: 8px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='foobar'> .foobar (alert)
<span>child (no alert)</span>
</div>
===
또는 !==
사용하는 "엄격한 평등 비교 알고리즘" , 그동안 ==
및 !=
사용 "추상 평등 비교 알고리즘" 형 강압적이다. 강제적 인 유형에 대한 특별한 요구가없는 한 ( 일반적으로 규칙이 약간 복잡하기 때문에) 일반적인 지혜는 항상 엄격한 비교를 사용 하는 것 입니다. 이 경우 객체가 비교되고 있기 때문에 실제로 차이는 없지만 대부분의 사람들은 여전히 엄격한 비교를 고수 할 것 입니다.
최신 브라우저 만 타겟팅하지 않아도 작동하는 다른 방법이 있습니다. 그냥 CSS를 추가하십시오
pointer-events: none;
클릭을 캡처하려는 div의 모든 하위 사용자에게 지원 테이블은 다음과 같습니다
click
의 프로그램에 클릭 이벤트 트리거가 차단되어야 하는가?
버블 링을 유리하게 사용할 수 있습니다.
$('.foobar').on('click', function(e) {
// do your thing.
}).on('click', 'div', function(e) {
// clicked on descendant div
e.stopPropagation();
});
<a>
요소 에 대한 클릭 만 제외하고 싶기 때문에 특정 시나리오에 적합한 솔루션처럼 보입니다 . 하나의 문제가 있습니다. 중간 클릭하면 이벤트가 계속 트리거됩니다 (Chrome에서 테스트 됨). 이것을 방지하는 변형이 있습니까?
//bind `click` event handler to the `.foobar` element(s) to do work,
//then find the children of all the `.foobar` element(s)
//and bind a `click` event handler to them that stops the propagation of the event
$('.foobar').on('click', function () { ... }).children().on('click', function (event) {
event.stopPropagation();
//you can also use `return false;` which is the same as `event.preventDefault()` and `event.stopPropagation()` all in one (in a jQuery event handler)
});
이렇게하면 click
요소의 모든 자식 요소 에서 이벤트 전파 (버블 링)가 중지되어 .foobar
이벤트가.foobar
요소에 이벤트 핸들러를 시작 .
데모는 다음과 같습니다. http://jsfiddle.net/bQQJP/
내 경우는 비슷하지만, 당신이 거의없는 경우입니다 foobar
한 번의 클릭 당 하나만 닫으려는 경우입니다.
$(".foobar-close-button-class").on("click", function () {
$(this).parents('.foobar').fadeOut( 100 );
// 'this' - means that you finding some parent class from '.foobar-close-button-class'
// '.parents' -means that you finding parent class with name '.foobar'
});
$(".foobar-close-button-class").on("click", function () {
$(this).child('.foobar-close-button-child-class').fadeOut( 100 );
// 'this' - means that you finding some child class from '.foobar-close-button-class'
// '.child' -means that you finding child class with name '.foobar-close-button-child-class'
});
pointer-events: none;
최신 브라우저를 사용할 수없고 타겟팅 하는 경우 다음 composedPath
과 같이 객체를 직접 클릭 하는 것을 감지 할 수 있습니다 .
element.addEventListener("click", function (ev) {
if (ev.composedPath()[0] === this) {
// your code here ...
}
})
구성된 경로에 대한 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath를 참조 하십시오.
// if its li get value
document.getElementById('li').addEventListener("click", function(e) {
if (e.target == this) {
UodateNote(e.target.id);
}
})
function UodateNote(e) {
let nt_id = document.createElement("div");
// append container to duc.
document.body.appendChild(nt_id);
nt_id.id = "hi";
// get conatiner value .
nt_id.innerHTML = e;
// body...
console.log(e);
}
li{
cursor: pointer;
font-weight: bold;
font-size: 20px;
position: relative;
width: 380px;
height: 80px;
background-color: silver;
justify-content: center;
align-items: center;
text-align: center;
margin-top: 0.5cm;
border: 2px solid purple;
border-radius: 12%;}
p{
cursor: text;
font-size: 16px;
font-weight: normal;
display: block;
max-width: 370px;
max-height: 40px;
overflow-x: hidden;}
<li id="li"><p>hi</p></li>