【发布时间】:2022-10-04 18:39:04
【问题描述】:
在反应中,我需要能够打开一个弹出窗口https://developer.mozilla.org/en-US/docs/Web/API/Window/open 并管理诸如“消息”https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage 和“加载”和“关闭”事件之类的事件。
但是,我添加侦听器的事件都没有触发......
import * as React from 'react';
import './style.css';
import { useState, useRef } from 'react';
export default function App() {
const { login, error } = useOAuth();
return (
<div>
<button onClick={login}>Login</button>
</div>
);
}
const useOAuth = () => {
const [error, setError] = useState();
const popupRef = useRef<Window | null | undefined>();
const login = () => {
popupRef.current = openPopup('https://google.com');
popupRef.current.addEventListener('load', handlePopupLoad);
popupRef.current.addEventListener('close', handlePopupClose);
popupRef.current.addEventListener('message', handlePopupMessage);
};
const handlePopupLoad = (data) => {
console.log('load', data);
};
const handlePopupClose = (data) => {
console.log('close', data);
};
const handlePopupMessage = (data) => {
console.log('message', data);
};
const openPopup = (url: string) => {
const params = `scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,
width=500,height=600,left=100,top=100`;
return window.open(url, 'Login', params);
};
return {
login,
error,
};
};
https://stackblitz.com/edit/react-ts-qlfw9q?file=App.tsx
在旁边:
- 有没有办法区分“用户”使用“红色 x”按钮关闭窗口和使用 window.close() 正确关闭窗口的时间。
- 如何在弹出窗口关闭后很好地清理它。
【问题讨论】:
-
这不是反应故障。它也不适用于香草 js
-
我知道,我也很惊讶它不起作用
-
如果你在同一个来源,在子页面,你可以做
window.parent.postMessage("some message"),在父窗口,你可以添加一个事件监听器:window.addEventListener('message', handlePopupMessage) -
是的。因此,我们可以将消息 eventListener 添加到我们的窗口对象,而不是我们孩子的窗口,反之亦然。
标签: javascript reactjs