使 document.ready 考虑来自外部 iframe 的元素

Posted

技术标签:

【中文标题】使 document.ready 考虑来自外部 iframe 的元素【英文标题】:Make document.ready take into account elements from external iframe 【发布时间】:2013-04-22 12:43:40 【问题描述】:

我发现自己的位置如下。我有一个 jQuery 插件,它需要嵌套在 document.ready 函数中。该插件将一些样式应用于页面元素。受此插件影响的元素之一包含 iframe。这个 iframe 不是来自我的网站。问题是document.ready 没有考虑 iframe 的内容,加载时高度会发生变化,但之前已经应用了 jQuery 插件,因此页面布局搞砸了。

我尝试了以下方法以确保仅在文档准备好并且 iframe 也准备好时调用插件获取:

$(document).ready(function() 
    $('#frameId').ready(function() 
    //plugin code
    );
);

但这不起作用,我正在寻找另一种解决方案。

【问题讨论】:

【参考方案1】:

只有文档有 ready() 事件,对于 iFrame 来说,它会是 onload :

$(document).ready(function() 
    $('#frameId').on('load', function() 
    //plugin code
    );
);

但是为什么你的插件需要访问 iFrame 呢?

【讨论】:

如果 iframe 在另一个域上,该加载事件是否仍会触发? @jmort253 - 你为什么不试试呢? 我真的不需要访问 iframe,但我必须知道它的高度以及加载的内容才能使插件工作。 @LeeTaylor - 正如我们所说的那样。然而,我想说的是,我认为不会。 你只会得到在 CSS 中设置的 iFrame 元素的高度,你真的不需要等待它加载来做到这一点?【参考方案2】:

解决办法是$.holdReady();

$.holdReady(true);
$(document).ready(function() 
    //plugin code
);

$('#frameId').on('load', function() 
   $.holdReady(false);
);

要访问跨域 iFrame 内容的高度,您需要 postMessage。看看这个post

【讨论】:

以上是关于使 document.ready 考虑来自外部 iframe 的元素的主要内容,如果未能解决你的问题,请参考以下文章

Angular 外部 js 库调用 Document.Ready

jQuery文档内部或外部的功能准备就绪

jquery代码如何写到外部js中 为啥 在外部js中 写上 $(document).ready(function();就报错

$(document).ready和window.onload的区别

$(document).ready和window.onload的区别

Turbolinks 实现 document.ready,点击切换