这已经很晚了,但我想知道为什么 energee's solution 有效:具体来说,<object> 元素如何影响其父元素。
tl;dr 您不能单击其中包含 <object> 元素的锚点,因为单击事件正在被 <object> 元素内部的任何内容捕获,然后不会将其冒泡。
jsfiddle
扩展原始问题中描述的症状:不仅锚元素内的<object>元素会导致锚变得不可点击,似乎<object>元素作为任何元素的子元素 将导致click、mousedown 和mouseup 事件(也可能是触摸事件)不会在父元素上触发,(当您在<object> 的边界矩形内单击时.)
<span>
<object type="image/svg+xml" data="https://icons.getbootstrap.com/icons/three-dots.svg">
</object>
</span>
document
.querySelector('span')
.addEventListener('click', console.log) // will not fire
现在,<object> 元素的行为有点“像”<iframe>s,因为它们将建立新的浏览上下文,包括当内容是 <svg> 文档时。在 JavaScript ,这通过 HTMLObjectElement.contentDocument 和 HTMLObjectElement.contentWindow 属性的存在来体现。
这意味着如果你在<object> 内的<svg> 元素中添加一个事件监听器:
document
.querySelector('object')
.contentDocument // returns null if cross-origin: the same-origin policy
.querySelector('svg')
.addEventListener('click', console.log)
然后单击图像,您将看到正在触发的事件。
那么pointer-events: none; 解决方案的工作原理就很清楚了:
这也应该解释z-index 解决方案:只要您可以防止click 事件被发送到嵌套文档,点击应该按预期工作。
(在我的测试中,只要父元素不是inline 并且<object> 被定位并且具有负值z-index,z-index 解决方案就可以工作)
(或者,您可以找到一种方法将事件重新冒泡):
let objectElem = document.querySelector('object')
let svgElemt = objectElem.contentDocument.querySelector('svg')
svgElem.addEventListener('click', () => {
window.postMessage('Take this click event please.')
// window being the outermost window
})
window.addEventListener('message', console.log)