gpt4 book ai didi

javascript - 使用 javascript 冒泡/捕获检测中间节点

转载 作者:行者123 更新时间:2023-11-29 23:46:41 28 4
gpt4 key购买 nike

我需要使用事件委托(delegate)捕获内部带有图像的 anchor 节点。

document.addEventListener(
'click',
function(event) {
console.log(event.target);
return true;
},
false
);
<a href="#" class="link">
<img src="http://placehold.it/100x100" alt="">
</a>

event.target 总是 img

如何检查点击是否发生在具有类 .link 的节点上?

更新:这里要明确的是 an example with jQuery

当我使用 jQuery.on() 时,在回调函数的 this 属性中有一个 a 节点,而不是 img 节点。使用纯 JS,我只能确定初始目标。

最佳答案

你可以通过调用来检查一个元素是否有一个类:

element.classList.contains('link');

你现在想要的是在收到 <img> 时做点什么。在 <a class="link"> 内被点击。判断是否点击了<img>有 parent <a class="link">我们必须向上遍历它的父树并检查。

这与您拥有的 jQuery 示例非常相似,即

$('body').on('click', '.link', callback)

除了 jQuery 匹配整个查询,而不仅仅是一个类。

以下是您可以执行此操作的方法:

// function to determine if the element has the link class
const hasLinkClass = element => element
? element.classList && element.classList.contains('link')
: false;

// function that accepts an event handler and returns
// a wrapper function arround it.
// The wrapper is called it if the passed in event
// object contains as its target an <img> with a parent
// with .link class
function filterImagesWithinLinks(handler) {
return function(event) {
let elem = event.target;

// ignore clicks that are not on an image (it might be better to be more specific here)
if (elem.tagName === 'IMG') {

// filter until we find the parent with .link class
while (elem && !hasLinkClass(elem)) {
elem = elem.parentNode;
}

// if a parent with .link class was found,
// call the original handler and set its `this`
// to the parent.
if (elem) {
handler.call(elem, event);
}
}
};
}

// function handler that fires when
// an <img> that has a parent with
// class 'link' was clicked
function handler(event) {
console.log('target : ', event.target);
console.log('this : ', this);
}

document.addEventListener(
'click',
filterImagesWithinLinks(handler),
false
);
a.link {
display: block;
padding: 10px;
background: #018bbc;
}

.middle {
background: salmon;
padding: 10px;
text-align: center;
}
<a href="#" class="link">
<p class="middle">
<img src="http://placehold.it/100x100" alt="" />
</p>
</a>

关于javascript - 使用 javascript 冒泡/捕获检测中间节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43743501/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com