首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 子窗口向父窗口传值

在JavaScript中,子窗口向父窗口传值通常涉及window.opener对象的使用。以下是基础概念和相关操作的详细解释:

基础概念

  1. window.opener: 当一个窗口是通过window.open()方法打开的,那么这个新窗口会有一个opener属性,指向打开它的窗口。
  2. postMessage API: 这是一个安全的跨源通信机制,允许不同源的窗口之间传递消息。

传值方法

方法一:使用 window.opener

父窗口代码:

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>Parent Window</title>
</head>
<body>
    <button onclick="openChildWindow()">Open Child Window</button>
    <div id="result"></div>

    <script>
        function openChildWindow() {
            var childWindow = window.open('child.html', '_blank');
        }

        // 监听来自子窗口的消息
        window.addEventListener('message', function(event) {
            // 安全检查,确保消息来源是预期的源
            if (event.origin !== "http://example.com") return;
            
            document.getElementById('result').innerText = event.data;
        });
    </script>
</body>
</html>

子窗口代码 (child.html):

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>Child Window</title>
</head>
<body>
    <button onclick="sendDataToParent()">Send Data to Parent</button>

    <script>
        function sendDataToParent() {
            var data = "Hello from child!";
            window.opener.postMessage(data, "http://example.com");
        }
    </script>
</body>
</html>

方法二:使用 localStoragesessionStorage

父窗口代码:

代码语言:txt
复制
// 监听storage事件
window.addEventListener('storage', function(event) {
    if (event.key === 'childData') {
        console.log('Data received from child:', event.newValue);
    }
});

子窗口代码:

代码语言:txt
复制
// 设置存储数据
localStorage.setItem('childData', 'Hello from child!');

优势与应用场景

  • postMessage:
    • 优势: 支持跨域通信,安全性高。
    • 应用场景: 当父窗口和子窗口不在同一个域时,或者需要更细粒度的控制消息传递时。
  • localStorage/sessionStorage:
    • 优势: 简单易用,适用于同源页面间的数据共享。
    • 应用场景: 同源页面间需要共享数据,且不需要实时通信的场景。

可能遇到的问题及解决方法

  1. 跨域问题:
    • 问题: 如果父窗口和子窗口不在同一个域,直接使用window.opener可能会遇到安全限制。
    • 解决方法: 使用postMessage API进行跨域通信,并确保验证消息来源。
  • 数据同步延迟:
    • 问题: 使用localStorage/sessionStorage时,可能会遇到数据更新后,父窗口不能立即获取到最新值的情况。
    • 解决方法: 确保父窗口正确监听了storage事件,并且在子窗口修改存储后立即通知父窗口。

通过以上方法和注意事项,可以实现JavaScript中子窗口向父窗口的安全有效传值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Vue.js 父组件向子组件传值和子组件向父组件传值

父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 // 创建 Vue 实例,得到 ViewModel var vm = new...this.parentmsg = '被修改了' } } } } }); 子组件向父组件传值...原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去; 父组件将方法的引用传递给子组件,其中,getMsg是父组件中...组件模板定义 --> 向父组件传值...-- 父组件向子组件 传递 方法,使用的是 事件绑定机制; v-on, 当我们自定义了 一个 事件属性之后,那么,子组件就能够,通过某些方式,来调用 传递进去的 这个 方法了 --> <com2

5.5K10
  • 父组件向子组件传值步骤

    父组件向子组件传值步骤: 在这里先定义一下,相对本案例来说:App.vue是父组件,Second-module.vue是子组件。 一、首先,值肯定是定义在父组件中的,供所有子组件共享。...所以要在父组件的data中定义值: 二、其次,父组件要和子组件有契合点:就是在父组件中调用、注册、引用子组件: 调用: 注册: 引用: 三、接下来,就可以在父组件和子组件链接的地方(...即引用子组件的标签上),把父组件的值绑定给子组件: 这里我绑定了两个值,一个是数组,一个是字符串。...、对象(Object) 其中,普通类型是可以在子组件中更改,不会影响其他兄弟子组件内同样调用的来自父组件的值, 但是,引用类型的值,当在子组件中修改后,父组件的也会修改,那么后果就是,其他同样引用了改值的子组件内部的值也会跟着被修改...父组件传给子组件的值,在子组件中千万不能修改,因其数据是公用的,改了所有引用的子组件就都改了。

    1.7K20

    Vue子组件向父组件传值

    父子组件通信父子组件通信是指一个组件向它的直接父组件传递数据或事件,或者从它的直接父组件接收数据或事件。在 Vue.js 中,父子组件通信可以通过 props 和自定义事件两种方式实现。...propsprops 是父组件向子组件传递数据的一种方式,类似于 React 中的 props。...父组件中通过在子组件标签上使用属性的方式传递数据,并且数据类型需要和子组件中声明的类型一致。自定义事件自定义事件是子组件向父组件传递数据或事件的一种方式。...父组件中使用 v-on 指令监听了该事件,并在事件处理函数中接收了子组件传递的数据,并将其赋值给 eventData 变量。最后,在父组件的模板中使用插值语法显示接收到的数据。2....兄弟组件 2 中通过 mounted 钩子函数监听了父组件中触发的 change-name 事件,并在事件处理函数中修改了 data 对象中的姓名值。

    23710

    vuejs — 父组件向子组件传值(父传子)「建议收藏」

    来看一下vue中的父组件向子组件传值的过程: (父组件)向(子组件)传值,那么子组件需要一个属性接收,大家应该都知道,使用 props 来接收; 举个例子: 有子组件...可以将这个数组,提出来放到父组件中,谁要用父组件就传给谁。 父组件向子组件传值,属于 属性传值。 props是子组件访问父组件数据的唯一接口....单向数据流: props是单向绑定的 当父组件的属性变化时,将传导给子组件,但是反过来不会。 每次父组件更新时,子组件的所有 props 都会更新为最新值。 不要在子组件内部改变 props。...提出,放到父组件App.vue中, -》看一下添加了数组Users的父组件App.vue, 我们思考:父组件、子组件之间有关联的地方是什么,没错,就是在调用子组件的时候,即下图中的父组件的users数组传给子组件呢??? 在子组件Users.vue,通过 -》props 属性接收父组件所传的数组 -》users 如下图所示: 如此,便是父传子了。

    1.4K30

    vue中父组件向子组件传值

    总体来说,父传子就是这四个步骤:父组件的data中定义值,引入并调用子组件,在引用的子组件的标签上通过v-bind指令给子组件传值,子组件通过在data中定义的props属性接收父组件传过来的值然后应用到子组件里...首先,值肯定是定义在父组件中的,供所有子组件共享,所以要在父组件的data中定义值: 然后,父组件要和子组件有契合点,就是要在父组件中引入、注册、调用子组件: 引入: 注册...: 调用:(父组件内在引用的子组件的标签上通过v-bind指令绑定上要传的值) 最后,子组件内部要去接收父组件传过来的值:使用props来接收 这样,子组件内部就可以直接使用父组件的值了...但是有要注意的点: 子组件接受的父组件的值分为——引用类型和普通类型两种, 普通类型:字符串(String)、数字(Number)、布尔值(Boolean)、空(Null)...引用类型:数组(Array)、对象(Object) 其中,普通类型是可以在子组件中更改,不会影响其他兄弟子组件内同样调用的来自父组件的值, 但是,引用类型的值,当在子组件中修改后,父组件的也会修改

    1.4K40

    Android 子activity关闭 向父activity传值

    可变通的,你可以启动一个Activity作为子Activity,它与父Activity有内在的联系。当子Activity关闭时,它会触发父Activity中的一个事件处理函数。...这个值将在后面用来作为有返回值Activity的唯一ID。...接下来的代码片段节选自子Activity的onCreate方法,显示了怎样向调用的Activity返回不同的结果: Button okButton = (Button) findViewById(R.id.ok_button...的结果 当子Activity关闭时,它的父Activity的onActivityResult事件处理函数被触发。...依赖于子Activity的目的,它可能会包含一个代表特殊的从列表中选择的数据的URI。可变通的,或额外的,子Activity可以使用“extras”机制以基础值的方式返回临时信息。

    1.7K50
    领券