Layer子iframe传数据到父页面的两种方式【按钮和非按钮】

以下两种方式均实测通过,按钮式通信如下,

首先是父页面的js代码

<script>
    //表单组件的渲染
    function form_open(){
        layer.open({
            title:'<i class="bi-table" style="font-size: 1rem; ">表单</i>'
            ,btn:['确定']
            ,type: 2
            ,maxmin: true //开启最大化最小化按钮
            ,content: 'form.html'
            ,area: ['344px', '100%']
            ,offset: 'lt' //左上角
            ,anim: 4
            ,shade:false
            ,yes: function (index, layero) {
                var iframeWin = window[layero.find('iframe')[0]['name']];
                var iframeModel = iframeWin.GetValue();//接收iframe传递过来的值
                //console.info(iframeModel);
                if (iframeModel != null) {
                    $("#design_div").append(iframeModel);
                    layer.close(index);
                }
                else {
                    layer.msg("请选择组件!");
                    layer.close(index);
                }
            }
        });
    } 
</script>

父页面的代码核心在于下面这两句,其中GetValue()函数是子页面中的

var iframeWin = window[layero.find('iframe')[0]['name']];  //这两句很重要
var iframeModel = iframeWin.GetValue();               //接收iframe传递过来的值

下面是子页面的js代码:

<script>
    var currentModel = $ ("#input-div").prop("outerHTML");
    console.log(currentModel);

    function GetValue() {
        return currentModel;//还可以传递对象
    }
</script>

以上父页面和子页面的代码实现效果:当父页面点击触发“layer.open”事件,打开子页面iframe,当子页面操作完数据,点击子页面iframe中的按钮,会触发GetValue事件将对应的数据传给父页面,父页面在对应的按钮响应事件进行捕获数据

PS:var iframeWin = window[layero.find('iframe')[0]['name']]; 这句代码有博主说可以当成取得子页面的全局对象Window将其保存到iframeWin中,我个人觉得非常有道理,可以以此为参考进行操作和理解

下面介绍非按钮式传递数据,子页面【iframe】js代码如下:

<script>
        //    post_data后面跟着的是父页面的地址
        var post_data = '123231232';
        window.parent.postMessage(post_data,'http://localhost/demo/header.html');
</script>

父页面的js代码如下:

<script>
    //  date就是子页面传过来的数据,如果要传多个数据,可以用json
    window.addEventListener('message',function(e){
        var Date=e.data;
        console.log(Date);
    },false);
</script>

此方式应用场景:比如子页面进行拖拽操作,需要传输数据到父页面时候,当子页面进行拖拽,就传输数据到父页面,如此不需要按钮触发