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