シャドウ要素に内部的にイベントハンドラを付けています(私はイベントをユーザに伝播していません)、dragover
イベントを処理しています。私はイベントをデバウンスしようとするまで、すべてうまく動作します。 setTimeout
を使用すると、イベントが発生したように(イベントターゲットは)<my-element>
のようにイベントが変更されたようです。どのようにシャドウDOMイベントをデバウンス/スロットルしますか?
これをより明確にするには、 <my-element>
には、いくつかの要素を含むshadow domがあります。 setTimeout
を指定しないと、シャドウ要素の1つでイベントが正常に発生します。たとえば、<my-element>
のシャドウドームの<li>
または<button>
です。 setTimeout
でイベントのデバウンスを試みるとすぐに、イベントターゲットは<my-element>
に変更されます。
私の質問です。あなたはどのように影のDOMイベントをデバウンスできますか?
HTML
<html>
<head></head>
<body>
<my-element>
#shadow-root (open)
<ul>
<li draggable="true">
<button>Hi</button>
</li>
<li draggable="true">
<button>Hi</button>
</li>
</ul>
<ul class="drop-target">
</ul>
</my-element>
</body>
</html>
Javascriptを:
//...class code
attachEventHandler(){
let self = this;
self.shadowElement.addEventListener('dragover', (function debouncedDragOverFactory(){
let timeoutId = 0,
evObj;
return function debouncedDragOver(ev){
evObj = ev; //Only tracking the last event
if(!timeoutId){
timeoutId = setTimeout(function(){
self.onDragOver(evObj); //self is 'this' pointer of the class this code is in.
//onDragOver handles the drag event, obvisouly.
timeoutId = 0;
}, 100);
}
};
})());
}
[更新]
はここPlunker exampleです。
2番目のイベントハンドラのsetTimeout
に1秒の遅延を付けました。だから'DIV'
のノード名がスクロールし、ノード名が'LIST-EXAMPLE'
であることがわかります。
divはshadowRootにあります。
LIST-EXAMPLEは、ウィンドウスコープイベントでユーザーに表示されるものです。
イベントの変化を回避するには、3番目のイベントハンドラで、必要なデータをコピーします。
私は 'のsetTimeout()は' window' 'にバインドされたデフォルトですが、私は信じています暗い地下世界に十分に精通していないため、それが理由です。 – zer00ne
それも私の推測でした。私はシャドウ・ルート上に別のウィンドウ・コンテキストがあるかどうかを確認するために遊んでいます...おそらくそうではありません。 私は必要なイベントからデータを取得し、それを渡すだけだと思います。 – Jerinaw
あなたの所見を投稿すると、私は不思議です。 – zer00ne