我正在尝试实现一个下拉菜单,你可以点击外面关闭 . 下拉列表是自定义日期输入的一部分,并封装在输入的shadow DOM中 .
我想写一些类似的东西:
window.addEventListener('mousedown', function (evt) {
if (!componentNode.contains(evt.target)) {
closeDropdown();
}
});
但是,事件被重新定位,因此 evt.target
始终是元素的外部 . 事件在到达窗口之前会有多个阴影边界,因此似乎无法真正了解用户是否在组件内部单击 .
Note: 我没有在任何地方使用聚合物 - 我需要一个适用于通用阴影DOM的答案,而不是聚合物特定的黑客 .
3 回答
shadowRoot
的event.target
将是host
元素 . 要关闭shadowDOM
中的<select>
元素,如果event.target
不是host
元素,则可以使用if (evt.target !== hostElement)
,然后在hostElement
上调用.blur()
另一个选项是检查目标元素的事件光标偏移:
您可以尝试使用
event
对象的path
属性 . 没有找到它的实际参考,MDN还没有它的页面 . HTML5Rocks虽然在影子dom教程中有一小部分关于它 . 因此,我不知道跨浏览器的兼容性 .找到W3 Spec关于事件路径,不确定这是否完全适用于
Event.path
属性,但它是我能找到的最接近的参考 .如果有人知道对Event.path的实际规范引用(如果链接的规范页面不是它),可以随意编辑它 .
它保留了事件经历的路径 . 它将包含阴影dom中的元素 . 列表中的第一个元素(
path[0]
)应该是实际单击的元素 . 请注意,您需要从阴影dom参考中调用contains
,例如shadowRoot.contains(e.path[0])
或阴影dom中的某个子元素 .演示:单击菜单展开,单击任意位置除菜单项将关闭菜单 .