为什么iframe.contentWindow == NULL?(Why is iframe.con

2019-06-27 14:18发布

我使用下面的代码来动态创建一个iframe。

var iframe_jquery = $("<iframe>")
    .addClass("foo")
    .appendTo(container); // container is a jQuery object containing a <div> which already exists

然后,我想访问其contentWindow,但它是空:

var iframe = iframe_jquery.get(0);
if (iframe){ // iFrame exists
    console.log(iframe.contentWindow); // Prints "null"
    var doc = iframe.contentWindow.document; // NullpointerException
}

所以我想:“也许iframe是不是准备好了没有?” 所以我想:

iframe_jquery.ready(function(){
    var iframe = iframe_jquery.get(0);
    console.log(iframe.contentWindow); // Prints "null"
    var doc = iframe.contentWindow.document; // NullpointerException
});

同样的结果。

怎么了?

Answer 1:

上周我有这个问题,同时借助iframe打(建设RTF编辑器),并没错这就是还没有准备好。

我想如果我把它放在一个.ready()它的工作,但.ready()是当DOM准备好,不能当的iFrame加载的内容,所以我结束了我的包裹代码使用jQuery .load()

所以,试试这个:

$(function () {  
    $("#myiframe").load(function () {                        
        frames["myframe"].document.body.innerHTML = htmlValue;
    });
}); 

希望这可以帮助



Answer 2:

问题是,你的<iframe>不会是“真实的”,直到它真正加入到页面的实际的DOM。 这里是一个小提琴证明。 。



Answer 3:

根据浏览器,访问document或一个<iframe>可能会发生变化。

下面是如何处理它的一个例子:

if (iframe.contentDocument) // FF Chrome
  doc = iframe.contentDocument;
else if ( iframe.contentWindow ) // IE
  doc = iframe.contentWindow.document;


Answer 4:

书签版

只是出于好奇,我想我应该把这个在一起。 记住,I帧和负载事件没有发挥好一起在不同的浏览器(主要是年纪大了,分崩离析,应待死的浏览器)...加上不是完全肯定的jQuery怎么来解决这个问题......我的大脑决定这将是更好的支持(无论是与否是不伦不类的):

$(function(){
  /// bind a listener for the bespoke iframeload event
  $(window).bind('iframeload', function(){
    /// access the contents of the iframe using jQuery notation
    iframe.show().contents().find('body').html('hello');
  });
  /// create your iframe
  var iframe = $('<iframe />')
        /// by forcing our iframe to evaluate javascript in the path, we know when it's ready
        .attr('src', 'javascript:(function(){try{p=window.parent;p.jQuery(p).trigger(\'iframeload\');}catch(ee){};})();')
        /// insert the iframe into the live DOM
        .appendTo('body');
});

之所以采取这种方法是,它通常是更好的从IFRAME自身内部触发加载事件。 但是,这是指具有在到的IFRAME加载适当的文件,所以对于动态I帧,这是一个小乏味。 这是一种具有一个文件加载,而不是之间的混合物组成。

一切上述作品我迄今已检测 - 是的,你是正确的 - 这是一个有点可笑,非面向未来的,并有负面的含义propably别的事情。)

一个积极的事情,我会说这个职位是介绍使用.contents()来访问的iframe,这至少是一点点有用的文件...



Answer 5:

您也可以在iframe中已通过将其设定的onload属性加载完成后,将要执行的功能。



文章来源: Why is iframe.contentWindow == null?