gpt4 book ai didi

polymer - 下的 Shadow DOM 事件如何定位?

转载 作者:行者123 更新时间:2023-12-02 15:13:28 24 4
gpt4 key购买 nike

我试图了解当通过 <content> 在影子 DOM 中接收到源自 light DOM 的事件时,它是什么样子的?元素。我正在阅读 Shadow DOM W3C Draft ,我并不完全理解它,但从 EventListener 附件的角度来看,事件似乎要“重新定位”。

In the cases where event path is across multiple node trees, the event's information about the target of the event is adjusted in order to maintain encapsulation. Event retargeting is a process of computing relative targets for each ancestor of the node at which the event is dispatched. A relative target is a node that most accurately represents the target of a dispatched event at a given ancestor while maintaining the encapsulation.

At the time of event dispatch:

  • The Event target and currentTarget attributes must return the relative target for the node on which event listeners are invoked

这里有一个简单的 Polymer 自定义元素,它只是将其子元素放入容器中,并向容器(在影子 DOM 中)添加一个单击事件监听器。在本例中,子级是一个按钮。

<!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 中获得一个目标,因为那是附加事件监听器的位置。我的问题是:

  1. 这是它应该的工作方式吗?
  2. 如果是这样,是否有其他方法可以让从 light DOM 冒泡的事件重定向到 Shadow DOM?

如果有人想问“你想做什么?”,除了理解这种行为之外,我不会尝试做任何具体的事情。

最佳答案

shadow dom 的事件很棘手。我尝试在下面捕获一个 Braindump。

  1. Is this the way it is supposed to work

是的。如果您在 Chrome 中进行测试,您将获得 native Shadow dom。

<小时/>

我在HTML5Rocks - Shadow DOM 301中写了关于事件重定向的部分。文章。基本上,重定向意味着源自 Shadow dom 的事件看起来像是来自元素本身。

在您的示例中,您正在将事件记录到shadow dom内部,因此仍然可以在那里看到它。如果您还在元素外部添加“点击”监听器,则目标看起来就像来自该元素:

<script>
var el = document.querySelector('#custom-element');
el.addEventListener('click', function(e) {
console.log(e.target.tagName); // logs FOO-Bar
});
</script>

http://jsbin.com/womususe/1/edit

“点击”事件冒泡。这就是为什么您会看到 BUTTON在你最上面的例子中。为什么你会看到它?您看到它是因为该按钮不是元素的 Shadow dom 的一部分。它位于光域和元素的目标中。重要的是要记住,轻量 DOM 节点在逻辑上仍然位于主文档中。它们没有移动到 Shadow dom 中,只是在 <content> 处渲染。插入点。

<小时/>

顺便说一句,您的示例有一些聚合修复:

  1. this.shadowRoot.querySelector('#internalcontainer') -> this.$.internalcontainerthis.$.ID是Polymer的“自动节点查找”功能。
  2. 您不需要使用 addEventListener()根本不。相反,使用 <div id="internalcontainer" on-click="{{clickHandler}}"> 。这是一个声明性事件处理程序。

关于polymer - <content> 下的 Shadow DOM 事件如何定位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24480808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com