Skip to content

Commit f472135

Browse files
committed
fix: defer event bind until contentWindow exists
1 parent 9296074 commit f472135

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

src/view/event-bindings/bind-events.ts

+32-14
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,40 @@ function getOptions(
1717
};
1818
}
1919

20-
let loaded = false;
20+
const getWin = (el: HTMLElement | Window) => {
21+
let win = el as Window | null;
2122

22-
function bindEvent(win: Window, binding: EventBinding, options: EventOptions) {
23+
if ((el as HTMLElement).nodeName === 'IFRAME') {
24+
win = (el as HTMLIFrameElement).contentWindow;
25+
}
26+
27+
return win;
28+
};
29+
30+
function bindEvent(
31+
el: HTMLElement | Window,
32+
binding: EventBinding,
33+
options: EventOptions,
34+
) {
2335
let timer: number | undefined;
2436

25-
if (!loaded) {
26-
// Some browsers require us to defer binding events, i.e. Safari
37+
if ((el as HTMLElement).nodeName === 'IFRAME') {
2738
timer = setInterval(() => {
28-
if ((win as Window).document.readyState === 'complete') {
29-
win.addEventListener(binding.eventName, binding.fn, options);
30-
loaded = true;
39+
const currentWin = getWin(el);
40+
41+
if (currentWin?.document.readyState === 'complete') {
42+
currentWin.addEventListener(binding.eventName, binding.fn, options);
43+
clearInterval(timer);
3144
}
3245
}, 100);
33-
} else {
34-
win.addEventListener(binding.eventName, binding.fn, options);
46+
47+
return timer;
3548
}
3649

50+
const win = getWin(el);
51+
52+
win?.addEventListener(binding.eventName, binding.fn, options);
53+
3754
return timer;
3855
}
3956

@@ -49,18 +66,19 @@ export default function bindEvents(
4966
'[data-rfd-iframe]',
5067
) as HTMLIFrameElement[];
5168

52-
const windows = [el, ...iframes.map((iframe) => iframe.contentWindow)];
69+
const els = [el, ...iframes];
5370

54-
return windows.map((win) => {
55-
if (!win) return function unbind() {};
71+
return els.map((currentEl) => {
72+
if (!currentEl) return function unbind() {};
5673

5774
const options = getOptions(sharedOptions, binding.options);
5875

59-
const timer = bindEvent(win as Window, binding, options);
76+
const timer = bindEvent(currentEl, binding, options);
6077

6178
return function unbind() {
6279
clearInterval(timer);
63-
win.removeEventListener(binding.eventName, binding.fn, options);
80+
const win = getWin(currentEl);
81+
win?.removeEventListener(binding.eventName, binding.fn, options);
6482
};
6583
});
6684
},

0 commit comments

Comments
 (0)