我正在尝试用html、css和vanilla JS制作SPA(我对JS知之甚少)。我遇到的问题是,我正在使用的方法,在我的头中工作正常,我只有“a”和里面的文本。但当我想使用img作为“a”时,脚本在img内部不起作用,它只允许我在img周围点击,而不是在它里面。我感谢任何帮助。这是我的脚本和我的html在我有问题的部分。第一个
0sgqnhkj1#
问题是,当您单击<img>时,target未设置为您的<a>标记,因此event.target.href为undefined。请不要使用onclick属性,而是使用委派的事件侦听程式,并检查它是否源自<a>标签或子代。
<img>
target
<a>
event.target.href
undefined
onclick
document.addEventListener("click", (e) => { const anchor = e.target.closest("a[href]"); if (anchor) { e.preventDefault(); window.history.pushState({}, "", anchor.href); handleLocation(); } });
演示~https://jsfiddle.net/dgn1r5zh/
5vf7fwbs2#
发生这种行为是因为event.target是对触发事件的元素的引用。在本例中,它是您的图像。首先,我要指出的是,不应该使用内联事件处理程序。它们会产生意想不到的行为,让你在HTML中编写JS。更多关于这个主题的信息。学习使用addEventListener。您可以通过添加一些CSS到您要单击的元素来解决您的问题。使用CSS pointer-events,您可以确定一个元素是否应该能够成为target。通过选择元素中所有要作为目标的元素,并设置pointer-events: none;以禁用这些元素上的指针事件来实现这一点。这确保了<a>标记是唯一可以被视为target的元素。因此,代码中的event.target将始终指向正确的元素。
event.target
addEventListener
pointer-events
pointer-events: none;
.mainServices-section * { pointer-events: none; }
或者,如果您无法使用pointer-events,例如,因为您需要在.mainServices-section的子系上引发其他指标事件,则您应该明确检查目前的目的是否为<a>标签,否则请尽可能选取<a>标签,以扩充您的程式码。你可以从点击的元素上的closest元素中的任何子元素中搜索<a>,它会向上搜索你要搜索的元素。
.mainServices-section
closest
const route = (event) => { const target = event.target.closest('.mainServices-section'); if (target === null) { return; } event.preventDefault(); window.history.pushState({}, "", target.href); handleLocation(); }; const mainServicesSections = document.querySelectorAll('.mainServices-section'); for (const mainServiceSection of mainServicesSections) { mainServiceSection.addEventListener('click', route); }
c8ib6hqw3#
您需要查找所单击元素ev.target的.closest("a"):第一个我更改的另一件事是查找<a>元素的href属性的方式:DOMelement.href将返回一个绝对路径,以“https://”开头,而DOMelement.getAttribute("href")实际上将获取元素属性中定义的字符串。
ev.target
.closest("a")
href
DOMelement.href
DOMelement.getAttribute("href")
3条答案
按热度按时间0sgqnhkj1#
问题是,当您单击
<img>
时,target
未设置为您的<a>
标记,因此event.target.href
为undefined
。请不要使用
onclick
属性,而是使用委派的事件侦听程式,并检查它是否源自<a>
标签或子代。演示~https://jsfiddle.net/dgn1r5zh/
5vf7fwbs2#
发生这种行为是因为
event.target
是对触发事件的元素的引用。在本例中,它是您的图像。首先,我要指出的是,不应该使用内联事件处理程序。它们会产生意想不到的行为,让你在HTML中编写JS。更多关于这个主题的信息。学习使用
addEventListener
。您可以通过添加一些CSS到您要单击的元素来解决您的问题。使用CSS
pointer-events
,您可以确定一个元素是否应该能够成为target
。通过选择元素中所有要作为目标的元素,并设置
pointer-events: none;
以禁用这些元素上的指针事件来实现这一点。这确保了<a>
标记是唯一可以被视为target
的元素。因此,代码中的event.target
将始终指向正确的元素。或者,如果您无法使用
pointer-events
,例如,因为您需要在.mainServices-section
的子系上引发其他指标事件,则您应该明确检查目前的目的是否为<a>
标签,否则请尽可能选取<a>
标签,以扩充您的程式码。你可以从点击的元素上的
closest
元素中的任何子元素中搜索<a>
,它会向上搜索你要搜索的元素。c8ib6hqw3#
您需要查找所单击元素
ev.target
的.closest("a")
:第一个
我更改的另一件事是查找
<a>
元素的href
属性的方式:DOMelement.href
将返回一个绝对路径,以“https://”开头,而DOMelement.getAttribute("href")
实际上将获取元素属性中定义的字符串。