问题 动态创建iframe并将onload事件附加到它


我已经创建了一个iframe动态并添加了一个src属性。然后我将这个iframe附加到页面的正文。知道我想将一个onload事件附加到iframe以读取iframe内容。有人可以建议我该怎么做。

frame = document.createElement('iframe');
frame.setAttribute('src','http://myurl.com');
body.appendChild(frame);
frame.onload = function(){
    alert('hi'); // here i want to read the content in the frame.
}

8094
2018-05-31 06:24


起源



答案:


有些浏览器确实有iframe的onload事件,首先你应该在设置iframe的src属性之前尝试附加它。

我完全避免使用它,因为在某些浏览器中它可能不会在某些条件下触发(例如,目标在IE中的缓存中)。

您可以使用计时器来检查框架的contentWindow的readystate是否完整

var inter = window.setInterval(function() {
    if (frame.contentWindow.document.readyState === "complete") {
      window.clearInterval(inter);
      // grab the content of the iframe here
    }
}, 100);

15
2018-05-31 08:07



多数民众赞成,正是我的意思。 - Anze Jarni
对于IE缓存的评论+1 thx - Christophe
它不适合我,因为iframe在另一个来源,我收到SecurityError:阻止一个原始框架“本地主机”;从访问跨源框架。 - Ofershap
你是对的,它确实只适用于相同的原始帧。假设window.onload功能今天更好,这可能更安全,具体取决于您计划支持的浏览器。 - Asaf


答案:


有些浏览器确实有iframe的onload事件,首先你应该在设置iframe的src属性之前尝试附加它。

我完全避免使用它,因为在某些浏览器中它可能不会在某些条件下触发(例如,目标在IE中的缓存中)。

您可以使用计时器来检查框架的contentWindow的readystate是否完整

var inter = window.setInterval(function() {
    if (frame.contentWindow.document.readyState === "complete") {
      window.clearInterval(inter);
      // grab the content of the iframe here
    }
}, 100);

15
2018-05-31 08:07



多数民众赞成,正是我的意思。 - Anze Jarni
对于IE缓存的评论+1 thx - Christophe
它不适合我,因为iframe在另一个来源,我收到SecurityError:阻止一个原始框架“本地主机”;从访问跨源框架。 - Ofershap
你是对的,它确实只适用于相同的原始帧。假设window.onload功能今天更好,这可能更安全,具体取决于您计划支持的浏览器。 - Asaf


我刚试过这个,它在Chrome中有效:

var iframe = document.createElement('iframe');
// append iframe to DOM however you like then:
iframe.contentWindow.parent.location.href // properly gives parent window's href.

W3school说 contentWindow 在所有主流浏览器中都受支持。


0
2017-10-29 21:03



我相信(W3school)他们,成千上万 - stellard


我怀疑你可以将onload事件附加到iframe。它不适用于所有浏览器。另一方面,您可以通过以下方式检查iframe是否已加载:

window.onload=function()
{
var iframe=document.getElementById('myframe');
if(iframe) 
    alert('The iframe has just been loaded.');
}

或者使用AJAX加载容器中的内容。使用AJAX,您可以设置适当的加载完成事件。


-1
2018-05-31 06:37



由于某种原因,我不想使用ajax .. - sushil bharwani
try onload =“return function_name();” - Anze Jarni
如果你想亲自处理问题并使问题复杂化,你可以创建一个定期计时器来记住iframe的document.body.innerHTML,并在每次更改时触发你自己的事件。如果您只需要一次,则可以在触发事件后销毁计时器。 - Anze Jarni