사용자 정의 이벤트 버블 링을 캡슐화하기 위해 섀도우 DOM을 사용하려고하지만 여전히 외부에서 스타일을 가져 오려고합니다.DOM을 그림자 처리하는 방법 외부에서 이벤트를 보복하고 사용자 정의 이벤트 버블 링을 방지하려면
나는 외부 스타일을 유지하지만 이벤트를 캡슐화 할 수없는 슬롯을 사용하려고했습니다.
나는 shadowroot에 자식을 직접 추가하려고 시도했지만 그 다음에 모든 외부 스타일을 잃어 버렸습니다. '레드
사용자 정의 이벤트 :
그래서 내가 무엇을 달성하고자하는 것은
외부 스타일 색상을 얻을 것이다,이 경우 기간에,에 피가 수 있습니다 ...이다 span-clicked '는 구성 요소의 경계에 의해 차단됩니다.
표준 이벤트 (예 : 클릭)에는 전체 구성 요소가 srcElement로 표시됩니다.
위의 세 가지를 모두 달성 할 수있는 방법이 있습니까? 고마워요!
var outer = document.getElementById('outer');
var shadowroot = outer.attachShadow({mode: 'open'});
shadowroot.innerHTML = `
<slot></slot>
`;
var spanInsideShadow = document.getElementById('span_inside_shadow');
shadowroot.appendChild(spanInsideShadow);
var spanInLightDom = document.getElementById('span_in_slot');
spanInsideShadow.addEventListener('click', function(e){
spanInsideShadow.dispatchEvent(new Event('span-clicked', {bubbles: true}));
});
outer.addEventListener('span-clicked', function(e){
console.log('outer received custom event. Do not want this!');
});
outer.addEventListener('click', function(e){
console.log('click event received, source elem = ', e.srcElement);
});
span {
color: red;
}
<div id='outer'>
<div id='inner'>
<span id='span_light_dom'> SPAN_IN_LIGHT_DOM_BUT_RENDERED_IN_SLOT </span>
</div>
</div>
<div>
<span id='span_normal'>A_NORMAL_SPAN_OUTSIDE </span>
</div>
<div>
<span id='span_inside_shadow'>SPAN_WILL_BE_APPENDED_TO_SHAODOW_ROOT</span>
</div>
원하는 동작은 Chrome 및 Safari에서 보는 것과 동일합니다. 다른 결과가 있습니까? 데모를 보려면 https://jsfiddle.net/8fhtx5g7/을 참조하십시오. – geekonaut
https://jsfiddle.net/b8ct5sfp/1/ 동일한 동작을 얻었습니다. – romuleald