对于Chrome上动态加载的iframe,未定义contentWindow
contentWindow is undefined for dynamically loaded iframe on Chrome
我正在编写一个Chrome扩展(在这种情况下,这一事实应该无关紧要)。
当用户选择文本时,我会动态添加一个iframe,例如:
var myframe = '<div id="modal-from-dom" class="modal hide fade" style="width: 673px;">' +
'<div class="modal-body">' +
'<iframe id="iFrameID" style="border: 0px;" src="http://www.example.com/" height="240px" width="638px"></iframe>' +
'</div>' +
'</div>';
$('body').append(myframe);
然后我继续搜索iFrame,直到返回一个非空对象。然后,我尝试访问contentWindow
属性,该属性最终未定义(尽管src
等其他属性也可以):
$('#iFrameID').prop('contentWindow'); // undefined
提前感谢您提出的任何想法。
附言:最终目标是获得iframe中元素的大小,这样我就可以使用postMessage
适当地调整iframe主机的大小。
这是Chrome扩展的一个已知问题。
iFrame的contentWindow
和contentDocument
属性是undefined
。window.frames
也是空的。结果是不能使用postMessage
向下通信到iFrame中。
请参阅http://code.google.com/p/chromium/issues/detail?id=20773
您可以通过使用与iframe的src
匹配的内容脚本来访问帧的window
,从而使用postMessage
API与之通信
下面是一个示例,它获取所有chrome消息,并将它们作为iframe:中的消息事件进行激发
chrome.extension.onMessage.addListener = function(request, sender, sendResponse){
// Pass on some messages context for local execution
window.postMessage(request, "*");
}
我建议对要显示的url进行ajax GET,获取html响应,添加一个脚本标记,该标记将使用postMessage作为父框架(扩展代码),然后将iframe的src设置为base64编码数据的数据url。阅读一些代码更容易:
var iFrameID = $(document.getElementById('iFrameID')); //This is very efficient.
$.get('http://www.example.com', function(response) {
postMessager = '<script>'+
'window.postMessage ... '+
参考https://developer.mozilla.org/en/DOM/window.postMessage此处
'</script>'
iFrameID.src = 'data:text/html;base64,' + utf8_to_b64(postMessager + response));
});
何处
function utf8_to_b64( str ) {
return window.btoa(unescape(encodeURIComponent( str )));
}
function b64_to_utf8( str ) {
return decodeURIComponent(escape(window.atob( str )));
}
在您的扩展代码中,您当然还需要postMessage代码。我知道这不是最完整的信息和代码,但我希望它能为您指明一个坚实的方向。小心将innerHTML插入到没有src属性的iframe中,因为不会运行javascript。如果你想在互联网上浏览任何常规页面,我有一些东西可以帮你做,你可以给我发信息。
- 尝试从我的 chrome 扩展程序访问 gmail 中的 iframe 时出现未定义的错误,但不是从开发者控制台访问
- Youtube iFrame API pauseVideo在UIWebView中未定义
- 动态IFRAME在IE11中具有未定义的主体
- TypeError: e.fixers 是动态加载的 iframe 上无前缀的未定义错误
- 如何在未在 iframe 中定义的 iFrame 中运行代码
- 未在 iFrame 中定义的 Javascript 变量
- 无法触发“loadVideoByUrl('..Youtube的Iframe-API的')“ – 未定义
- 一个有内容的iFrame怎么可能有一个未定义的contentDocument对象
- 调用时,iFrame在Javascript中未定义
- IFrame实体加载时未定义的值
- 对于Chrome上动态加载的iframe,未定义contentWindow
- 未定义Iframe调整器
- Iframe onload函数未定义
- 动态创建iframe的contentWindow未定义
- Jquery getclose()返回未定义标签的Iframe
- 文档.querySelector对于标准模式iframe在quirks模式父模式下运行是未定义的
- 当使用window.frames[name]访问时,iframe contentWindow未定义
- 停止iframe加载产生未定义错误
- ReferenceError:从iframe调用时未定义函数
- 无法读取 dojo/request/iframe 帖子上未定义的属性“值”