当域和协议匹配时获取 iframe 内容高度,但子域不匹配

Posted

技术标签:

【中文标题】当域和协议匹配时获取 iframe 内容高度,但子域不匹配【英文标题】:Get iframe content's height when domain & protocol match, but subdomain doesn't 【发布时间】:2018-01-08 13:24:49 【问题描述】:

我正在尝试获取 iframe 的(https://booking.yourdomain.com 来自 https://www.yourdomain.com)的内容,以便我可以设置它的高度。所以所有的内容都是可见的,像这样(我从here中取了表达式):

var booking_iframe = document.querySelector('iframe');

booking_iframe.onload = function() 
    booking_iframe.style.height = booking_iframe.contentWindow.document.body.offsetHeight + 'px';

但这会引发以下错误:

VM389:1 Uncaught DOMException: Blocked a frame with origin "https://www.yourdomain.com" from accessing a cross-origin frame.
    at <anonymous>:1:54

域和协议匹配,但子域不匹配,

有什么建议吗?

(如果你想玩调试器。我在生产环境中创建了一个test.html,只有 iframe)

-编辑-

作为一种解决方法: 知道如何启用 iframe 内容的滚动吗? (尝试了固定高度和溢出滚动,滚动=“是”但不起作用)

【问题讨论】:

域不“匹配”。就同​​源策略和跨源限制而言,“子域”的概念并不真正存在。就浏览器而言,您所处理的内容实际上与两个完全不匹配的域相同——https://www.yourdomain.comhttps://some.completely.other.site.com “启用 iframe 内容的滚动”是什么意思?在我看来,它是默认启用的(参见jsfiddle;在 Windows 上的 Chrome、Firefox 和 IE 中测试)。 我检查问题中的链接(test.html)你会发现这不是我的情况.. 是的,但我在 iframe 的定义中看到了 scrolling="no"。你能去掉那个属性吗? 【参考方案1】:

同源策略是浏览器阻塞的原因。

为了规避这个问题,将下面这行 JS 添加到包含 iframe 的页面和在 iframe 中加载的页面:

document.domain = "yourdomain.com";

更多详情请见https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin。

编辑:为了根据内容调整 iframe 的大小,我推荐iframe-resizer。

【讨论】:

如果你检查我的 test.html 的源代码,我已经在做这件事了。另一个子域是 c-name 记录,我无权访问它.. 在islamallorca.com/booking-test.html的源代码中,我看到的是window.domain = 'islamallorca.com';而不是document.domain = 'islamallorca.com';。请尝试 document.domain。然后确保这行代码也出现在 iframe 中加载的页面中。目前,嵌入页面中仍然缺少它(iframe src,例如booking.islamallorca.com:4475/fwbookingresponsivestep/...)。 确实,我犯了一个错误,将属性设置为window!问题是我改变了我的代码(booking_iframe.contentWindow.document.body.offsetHeight + 'px'; // returns 150px but the content is bigger)仍然返回 iframe 高度(不是它的内容)。知道如何得到它吗?谢谢! 哦,对不起,我忘了你不能从父页面访问 iframe 内的 DOM,除了通过 postMessage:developer.mozilla.org/en-US/docs/Web/API/Window/postMessage我认为你可以使用 iframe-resizer 快速实现你需要的东西:@987654326 @

以上是关于当域和协议匹配时获取 iframe 内容高度,但子域不匹配的主要内容,如果未能解决你的问题,请参考以下文章

jquery在加载时获取iframe内容的高度

隐藏 iframe 的内容高度

js 怎么获取iframe 的高度?

如何获取iframe里面iframe的高度

在选项卡更改时动态更改 iframe 的高度?

JS 获取iframe中的div高度