Flex打开新窗口将主窗口数据传给子窗口然后返回


为了实现Flex(这里我假设你指的是在Web开发中使用的Flexbox布局技术,但Flexbox本身并不直接控制窗口操作,所以我将这个问题理解为在Web环境中,使用JavaScript或类似技术在新窗口中打开页面并传递数据,然后可能需要从子窗口向父窗口返回数据的场景)中的这种需求,我们通常会使用`window.open()`来打开新窗口,并通过URL参数或`localStorage`、`sessionStorage`、`postMessage`等方法来传递数据。不过,由于直接通过新窗口返回数据到原窗口在Web环境中不是一个直接支持的操作(出于安全考虑),我们通常使用`postMessage`来实现跨窗口通信。

下面是一个简单的例子,说明如何在新窗口中打开页面并传递数据,然后从子窗口向父窗口发送数据:

### 父窗口(主窗口)代码


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Parent Window</title>
    <script>
        function openChildWindow() {
            var childWindow = window.open('child.html', '_blank');

            // 假设我们要传递的数据
            var dataToPass = { name: 'John Doe', age: 30 };

            // 通过URL参数传递(不推荐,因为限制于URL长度和安全性)
            // var urlWithParams = 'child.html?' + new URLSearchParams(dataToPass).toString();
            // childWindow = window.open(urlWithParams, '_blank');

            // 使用localStorage或sessionStorage传递(需要同步读取,不推荐跨窗口直接通信)

            // 更推荐使用postMessage
            childWindow.postMessage(dataToPass, '*'); // '*' 或具体的子窗口源

            // 监听来自子窗口的消息
            window.addEventListener('message', function(event) {
                if (event.origin !== 'http://yourdomain.com') { // 替换为你的子窗口域名
                    return;
                }
                console.log('Received message from child window:', event.data);
                // 处理接收到的数据
            }, false);
        }
    </script>
</head>
<body>
    <button onclick="openChildWindow()">Open Child Window</button>
</body>
</html>

### 子窗口(新窗口)代码 (`child.html`)


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Child Window</title>
    <script>
        // 监听来自父窗口的消息
        window.addEventListener('message', function(event) {
            console.log('Received message from parent window:', event.data);

            // 假设处理完数据后,需要向父窗口发送一些响应
            var responseData = { status: 'success', message: 'Data received' };
            event.source.postMessage(responseData, event.origin); // 发送回父窗口
        }, false);
    </script>
</head>
<body>
    <h1>Child Window</h1>
    <!-- 页面内容 -->
</body>
</html>

注意:

- 在这个例子中,我使用了`postMessage`方法来实现跨窗口通信。这是一种安全且推荐的方式,因为它允许你指定接收消息的来源。

- 请确保在实际应用中替换`event.origin`的值为你的子窗口或父窗口的实际域名,以增强安全性。

- 如果数据敏感或需要加密,你可能还需要考虑数据的加密传输。

- `window.open()`可能会被浏览器的弹窗拦截器阻止,特别是在没有用户交互(如点击事件)的情况下调用。