使用window.open()方法打开新页面,使用postMessage给新页面传递参数无效问题

// 主页面
window.newWin = window.open(url);
window.newWin.postMessage({ type: 1 },'http://localhost:8000');

// 新窗口打开后接收事件
window.addEventListener('message', function (data) {
alert('页面打开有数据来了:' + data);
});

问题:
使用window.open()方法打开新页面,使用postMessage给新页面传递参数时,第一次不触发新窗口'message'事件,保持新页面不关闭的情况下,再点击触发主页面以上代码,新窗口的'message'事件才会触发,且会触发两次

请大神帮忙指点下,不胜感激~~

阅读 7.3k
2 个回答

使用window.open()方法打开新页面,然后使用postMessage给新页面传递参数,第一次不响应的问题,换了种传参方式,将参数放在url中传递,猜测有可能是新页面未加载完成导致postMessage不生效,如果有其他想法和解决思路欢迎大神指点哈~~

解决思路:不使用ostMessage给新页面传递参数,将参数放在url中传递至新页面,如下:

    // 主页面
    const param = { type: 1 };
    const url = App.Util.getBasePath() + '#/newWindow?access_token=' + App.Temp.accessToken + '&param=' + JSON.stringify(param);
    window.newWin = window.open(url); 
    
    // 新窗口打开后获取参数
    initialize(JSON.parse(getUrlParam('param')));
 
     /**
     * 从url地址中获取拼接的参数值
     * @method  getUrlParam
     * @param   {String}    paramName 参数名称
     * @return  {String}    参数值
     */
    var getUrlParam = function (paramName) {
        var reg = new RegExp('(^|&)' + paramName + '=([^&]*)(&|$)');
        var str = window.location.search;
        var ret;
        if (!str) {
            str = window.location.hash;
        }
        if (str) {
            ret = str.substr(str.indexOf('?') + 1).match(reg);
        }
        if (ret) {
            return unescape(ret[2]);
        }
        return null;
    }
新手上路,请多包涵

window.newWin.onload=()=>{
window.newWin.postMessage()
}
这样可以解决

推荐问题