gpt4 book ai didi

javascript - 避免 event.target 引用子级而不是父级

转载 作者:行者123 更新时间:2023-12-03 06:08:00 29 4
gpt4 key购买 nike

我正在尝试获取 data attributes 一组链接按钮,创建一个事件监听器,如下所示:

// For all major browsers, except IE 8 and earlier
if (document.addEventListener) {
document.addEventListener("click", executeOnClick);
} else if (document.attachEvent) {
// For IE 8 and earlier versions
document.attachEvent("onclick", executeOnClick);
}

这个事件监听器执行下一个函数:

function executeOnClick(e){
//////////// Only elements which has "specialClass"
if (hasClass(e.target, 'specialClass')) {
if(e.target !== undefined){
console.info(e.target.getAttribute('data-info'));
e.preventDefault();
}
}
}

但是当链接按钮内部有其他标签时不起作用。示例:

<a data-info="Lorem ipsum 3!" href="#" class="specialClass">
<div>Link with div inside: <br> "event.target" is "div", not "a"</div>
</a>

当元素有或没有子元素时,我不知道如何让它工作。有人可以帮助我吗?

我的问题的Codepen:http://codepen.io/tomloprod/pen/gwaVXE

NOTE: I have omitted the definition of the hasClass method because this isn't the problem. Anyway, you can see it on the codepen.

最佳答案

您可以使用一个函数来递归地检查 parentNode 是否存在 data-info 属性。

这是一个示例。

//////////// This function works well.

function findParentWithData(elem) {
try {
if(elem.getAttribute('data-info'))
return elem;
} catch(e) {
console.log('This was an anchor without data-info attribute.')
return e
}
while(!elem.getAttribute('data-info')) {
return findParentWithData(elem.parentNode);
}
}

function hasClass(event, className) {
if (event.classList) {
return event.classList.contains(className);
}
return new RegExp('(^| )' + className + '( |$)', 'gi').test(event.className);
}

function executeOnClick(e) {

// if click came from body don't do anything
if (e.target === document.body) return;

var result = document.getElementById("result");
result.innerHTML = "";

//////////// Only elements that has "specialClass"

// find parent with data-info
var elem = findParentWithData(e.target)

if (elem instanceof Element && hasClass(elem, 'specialClass')) {
if(elem !== undefined){
result.innerHTML = "Information: " + elem.getAttribute('data-info');
e.preventDefault();
}
}
}

// For all major browsers, except IE 8 and earlier
if (document.addEventListener) {
document.addEventListener("click", executeOnClick);
} else if (document.attachEvent) {
// For IE 8 and earlier versions
document.attachEvent("onclick", executeOnClick);
}
.btn {
opacity:0.8;
border:0;
-webkit-border-radius: 28;
-moz-border-radius: 28;
border-radius: 28px;
font-family: Arial;
color: #ffffff;
font-size: 37px;
padding: 10px 20px 10px 20px;
text-decoration: none;
outline:0;
margin: 0em 0 1em 0;
display: -webkit-inline-box;

}
.btn:hover {
cursor:pointer;
opacity:1;

text-decoration: none;
}

.btn.red{
background:#e74c3c;
}
.btn.green{
background:#2ecc71;
}
<div id="result"></div>

<a data-info="Lorem ipsum!" href="#" class="btn green specialClass">Link: Working well</a>

<button data-info="Lorem ipsum 2!" class="btn green specialClass">Button: Working well too</button>

<a data-info="Lorem ipsum 3!" href="#" class="btn red specialClass">
<div>Link with div inside: <br> Doesn't work</div>
</a>

<a data-info="Lorem ipsum 4!" href="#" class="btn red specialClass">
<ul>
<li>
Link with ul inside:
</li>
<li>
Doesn't work
</li>
</ul>
</a>

<a href="#" class="btn red">Foo</a>

关于javascript - 避免 event.target 引用子级而不是父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39450972/

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