这已经很晚了,但我想知道为什么energee 的解决方案有效:具体来说,<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>
,因为它们将建立新的浏览上下文,包括内容是<svg>
文档时。HTMLObjectElement.contentDocument
在 JavaScript 中,这通过和HTMLObjectElement.contentWindow
属性的存在表现出来。
这意味着,如果您向以下<svg>
元素中的元素添加事件侦听器<object>
:
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
将事件发送到嵌套文档,单击应该按预期工作。
(在我的测试中,z-index
只要父元素不是inline
并且<object>
被定位并且具有负数,该解决方案就可以工作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)