【发布时间】:2014-06-29 22:22:41
【问题描述】:
我试图了解当通过 <content> 元素在影子 DOM 中接收到源自 light DOM 的事件时,这些事件是什么样子的。我正在阅读Shadow DOM W3C Draft,我并不完全理解它,但从 EventListener 附件的角度来看,这听起来像是要“重新定位”事件。
在事件路径跨越多个节点树的情况下, event关于事件目标的信息按顺序调整 保持封装。事件重定向是一个计算过程 事件所在节点的每个祖先的相对目标 派出。相对目标是最准确的节点 表示给定祖先的已调度事件的目标,而 维护封装。
和
事件派发时:
- Event target 和 currentTarget 属性必须返回相对的 调用事件侦听器的节点的目标
所以这里有一个简单的 Polymer 自定义元素,它只是将其子元素放入容器中,并向容器(在影子 DOM 中)添加一个 click EventListener。在这种情况下,孩子是一个按钮。
<!DOCTYPE html>
<html>
<head>
<script src="bower_components/platform/platform.js"></script>
<link rel="import" href="bower_components/polymer/polymer.html">
</head>
<body unresolved>
<polymer-element name="foo-bar">
<template>
<div id="internal-container" style="background-color:red; width:100%;">
<content></content>
</div>
</template>
<script>
Polymer("foo-bar", {
clickHandler: function(event) {
console.log(event);
var element = event.target;
while (element) {
console.log(element.tagName, element.id);
element = element.parentElement;
}
},
ready: function() {
this.shadowRoot.querySelector('#internal-container').addEventListener('click', this.clickHandler);
}
});
</script>
</polymer-element>
<foo-bar id="custom-element">
<button>Click me</button>
</foo-bar>
</body>
</html>
当我在 Chrome 38.0.2075.0 canary 上运行它时,当我点击按钮时,我得到:
MouseEvent {dataTransfer: null, toElement: button, fromElement: null, y: 19, x: 53…}altKey: falsebubbles: truebutton: 0cancelBubble: falsecancelable: truecharCode: 0clientX: 53clientY: 19clipboardData: undefinedctrlKey: falsecurrentTarget: nulldataTransfer: nulldefaultPrevented: falsedetail: 1eventPhase: 0fromElement: nullkeyCode: 0layerX: 53layerY: 19metaKey: falsemovementX: 0movementY: 0offsetX: 45offsetY: 10pageX: 53pageY: 19path: NodeList[0]relatedTarget: nullreturnValue: truescreenX: 472screenY: 113shiftKey: falsesrcElement: buttontarget: buttontimeStamp: 1404078533176toElement: buttontype: "click"view: WindowwebkitMovementX: 0webkitMovementY: 0which: 1x: 53y: 19__proto__: MouseEvent test.html:17
BUTTON test.html:20
FOO-BAR custom-element test.html:20
BODY test.html:20
HTML test.html:20
当我点击容器时,我得到:
MouseEvent {dataTransfer: null, toElement: div#internal-container, fromElement: null, y: 15, x: 82…} test.html:17
DIV internal-container test.html:20
所以我在 light 或 shadow DOM 中获得了一个事件目标,具体取决于 source 元素所在的 DOM。在这两种情况下,我都希望从 shadow DOM 中获得一个目标,因为那是附加 EventListener 的位置。我的问题是:
- 这是它应该的工作方式吗,并且
- 如果是这样,是否有其他方法可以让从 light DOM 重新定位到 shadow DOM 的事件冒泡?
如果有人想问,“你想做什么?”,除了理解行为之外,我不会做任何具体的事情。
【问题讨论】:
标签: polymer web-component shadow-dom