将全局窗口范围变量传递给同一域中的子iframe

时间:2018-01-02 21:46:45

标签: javascript html iframe

  • 如果使用setTimeout更改iframe.src属性,为什么iframe会报警未定义? 在setimeout工作之外更改iframe.src属性。

  • 如果修改|拦截iframe的eval,Function,Element.prototype.appendChild对象,如果它们与父窗口不同(Element!== parent.Element)?

main.html中

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>IFrame var pass test</title>
</head>
<body>
    <script type='text/javascript'>
        ifel = document.createElement('iframe') ;
        ifel.frameBorder = ifel.style.width = ifel.style.height = 0 ;
        ifel.style.position = 'absolute' ;
        ifel.id = 'id-iframe-x' ;
        document.body.appendChild(ifel) ;
        ifel.contentWindow.Z = 'Y' ; // window changed after load ???
        ifel.addEventListener('load', function () {
            ifel.contentWindow['Z'] = 'Z' ;  // change after load
        }) ;
        // ifel.src = 'iframe.html' ;  // <-- WORK !
        setTimeout(function() {        // <-- NOT WORK !
            ifel.src = 'iframe.html' ;
        }, 3000) ;
    </script>
</body>
</html>

Iframe.html的

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>IFrame var pass test</title>
</head>
<body>
    <script type='text/javascript'>
        alert(typeof window.Z) ;
    </script>
</body>

1 个答案:

答案 0 :(得分:0)

您在iframe加载后从父级更改iframewindow.Z的值 - 这是正确的。但是,您的iframe会在iframe完成加载之前运行其警报。您需要在iframe窗口上定义一个函数,并在加载iframe后从父窗口调用它。您也可以尝试推迟iframe脚本,但这会创建竞争条件 - 它现在可能有效,但可能并非总是如此,尤其是如果您从父级添加了异步数据。