@@ -2,6 +2,7 @@ import { render_effect } from '../../reactivity/effects.js';
2
2
import { all_registered_events , root_event_handles } from '../../render.js' ;
3
3
import { define_property , is_array } from '../../utils.js' ;
4
4
import { hydrating } from '../hydration.js' ;
5
+ import { queue_task } from '../task.js' ;
5
6
6
7
/**
7
8
* SSR adds onload and onerror attributes to catch those events before the hydration.
@@ -34,18 +35,14 @@ export function replay_events(dom) {
34
35
* @param {string } event_name
35
36
* @param {Element } dom
36
37
* @param {EventListener } handler
37
- * @param {boolean } capture
38
- * @param {boolean } [passive]
39
- * @returns {void }
38
+ * @param {AddEventListenerOptions } options
40
39
*/
41
- export function event ( event_name , dom , handler , capture , passive ) {
42
- var options = { capture, passive } ;
43
-
40
+ export function create_event ( event_name , dom , handler , options ) {
44
41
/**
45
42
* @this {EventTarget}
46
43
*/
47
44
function target_handler ( /** @type {Event } */ event ) {
48
- if ( ! capture ) {
45
+ if ( ! options . capture ) {
49
46
// Only call in the bubble phase, else delegated events would be called before the capturing events
50
47
handle_event_propagation ( dom , event ) ;
51
48
}
@@ -54,7 +51,32 @@ export function event(event_name, dom, handler, capture, passive) {
54
51
}
55
52
}
56
53
57
- dom . addEventListener ( event_name , target_handler , options ) ;
54
+ // Chrome has a bug where pointer events don't work when attached to a DOM element that has been cloned
55
+ // with cloneNode() and the DOM element is disconnected from the document. To ensure the event works, we
56
+ // defer the attachment till after it's been appended to the document. TODO: remove this once Chrome fixes
57
+ // this bug.
58
+ if ( event_name . startsWith ( 'pointer' ) ) {
59
+ queue_task ( ( ) => {
60
+ dom . addEventListener ( event_name , target_handler , options ) ;
61
+ } ) ;
62
+ } else {
63
+ dom . addEventListener ( event_name , target_handler , options ) ;
64
+ }
65
+
66
+ return target_handler ;
67
+ }
68
+
69
+ /**
70
+ * @param {string } event_name
71
+ * @param {Element } dom
72
+ * @param {EventListener } handler
73
+ * @param {boolean } capture
74
+ * @param {boolean } [passive]
75
+ * @returns {void }
76
+ */
77
+ export function event ( event_name , dom , handler , capture , passive ) {
78
+ var options = { capture, passive } ;
79
+ var target_handler = create_event ( event_name , dom , handler , options ) ;
58
80
59
81
// @ts -ignore
60
82
if ( dom === document . body || dom === window || dom === document ) {
0 commit comments