如何从另一个域调整 iframe 的大小?
过去几天,我一直在尝试将一个 iframe 集成到一个站点中。这是一个短期的解决方案,而另一方开发和 API (可能需要几个月...) 因为这是作为短期解决方案,我们确实想使用 easyXDM-我有权访问其他域,但它的困难足以要求他们添加 p3p 头,因为它是... ..。
3个 iframe
我找到的最接近的解决方案是3 iframe-但它去精神的 chrome 和狩猎,所以我不能使用。
用铬合金打开
Http://css-tricks.com/examples/iframeresize/crossdomain.php#frameid=frame-one&height=1179
测量滚动条
I found a another post on how to use the scrollheight to try and resize the form.. in theory it works well but I could not apply it properly using the iframes scroll height..
document.body.scrollHeight
这显然使用了主体高度(不能100% 访问这些属性是基于客户端显示画布而不是 X 域文档高度)
我尝试使用 jQuery 来获得 iframe 的高度
$('#frameId').Height()
$('#frameId').clientHeight
$('#frameId').scrollHeight
返回的值在 chrome 和 ie 中不同-或者根本没有意义。 问题是框架内的所有东西都被拒绝了-甚至滚动条..。
计算样式
但是,如果我检查 iframe 的 chrome 中的元素,它会很糟糕地向我显示 iframe 内部的文档维度(使用 jQuery x-domain 来拒绝 iframe. heigh-access) 计算出的 CSS < img src = “ https://i.stack.imgur.com/wox5C.jpg”alt = “”/>
中没有任何内容Now how does chrome calculate that? (edit- browser re-renders the page using its build in rendering engine to calculate all these settings - but are not attached anywhere to prevent cross-domain fraud.. so..)
HTML4
我读了 HTML4.x 的规范,它说应该有通过 document.element 公开的只读值,但是它通过 jQuery 被拒绝访问
代理框架
I went down the route of proxying the site back and calculating which is OK.. until a user logs in through the iframe and the proxy gets a login page instead of the actual content. Also to some calling the page twice is not acceptable
Http://www.codeproject.com/kb/aspnet/asproxy.aspx
Http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/
重新渲染页面
I did not go this far but there are jscript engines out there that will look at the source and re-render the page based on the source file. but it would require hacking those jscripts.. and that's not an ideal situation for commercial entities... 有些调用纯 Java 小应用程序或服务器端呈现
Http://en.wikipedia.org/wiki/server-side_javascript
Http://htmlunit.sourceforge.net/ <-java 而非 jscript
所有这些都可以用 HTML5套接字来完成,但是 easyXDM 对于非 HTML5的投诉页面来说是一个很好的备用方案。
解决方案1 强 > 非常好的解决方案!
使用 easyXDM
在服务器上,以下面的形式设置一个页面
<html>
<head>
<script src="scripts/easyXDM.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">
var transport = new easyXDM.Socket(/** The configuration */{
remote: "http://www.OTHERDOMAIN.example/resize_intermediate.html?url=testpages/resized_iframe_1.html",
//ID of the element to attach the inline frame to
container: "embedded",
onMessage: function (message, origin) {
var settings = message.split(",");
//Use jquery on a masterpage.
//$('iframe').height(settings[0]);
//$('iframe').width(settings[1]);
//The normal solution without jquery if not using any complex pages (default)
this.container.getElementsByTagName("iframe")[0].style.height = settings[0];
this.container.getElementsByTagName("iframe")[0].style.width = settings[1];
}
});
</script>
</head>
<body>
<div id="embedded"></div>
</body>
在调用者域中,它们只需要将中间 _ frame HTML 和 easyXDM.js
添加到相同的位置。像父文件夹-然后你可以访问相对目录或包含的文件夹只为你。