iframe全跨域高度自适应解决方案

作者:陈成 来源:经典论坛 时间:2008-12-21 16:16:00 

看到这个需求的时候就在暗爽,又可以搞定一个知识点了。哈哈,一天的奋斗之后,果然有所收获,而且经过怿飞的指点,在跨域问题解决上还有所突破(不通过hash)。

Demo,兼容IE,FF,Safari。

方案说明:

需求是:A页面(taobao.com)要嵌入B页面(alibaba.com),因为不能确定B页面的高度,所以要求高度自适应。


解决方法:简单来说就是在B页面里创建一个和A同域的iframe C,让C和A之间可以通讯,以把B的高度传过去。

那么怎么传过去呢?以前的方法是在C里改变parent.parent(即A)的location.hash,但是改hash会生成浏览器历史记录,点后退前进按钮用户体验不佳。我们试了下在A页面直接取frames[ b ].frames[c].location.hash,居然可以取到。

剩下的就简单了,在A里设置iframe B装载完成后获取C的hash,然后通过hash设置iframe B的高度。

具体代码:

A页面:(基于YUI)

/**
* 待iframe载入后执行函数
*
* @param {Element} el
* @param {Function} func
*/
var onIframeLoad = function(el, func) {
    var cb = function() {
        try {
            func.call(this);
        } catch (e) {}
    }
    if (TB.bom.isIE) {
        el.onreadystatechange = function(){
            if (el.readyState == 'complete') {
                setTimeout(cb, 0);
                el.onreadystatechange = null;
            }
        }
    } else {
        el.onload = function() {
            setTimeout(cb, 0);
            el.onload = null;
        }
    }
};
/**
* 跨域iframe高度自适应封装
*
* @param {String} name
*/
var crossDomainIframe = function(name) {
    var iframe = YAHOO.util.Dom.get(name);
    var xclient = 'xclient';
    onIframeLoad(iframe, function(){
        try {
            var h = frames[name].frames[xclient].location.hash.substring(1);
            if (h == '') {
                var func = arguments.callee;
                setTimeout(function(){ func(); }, 20);
                return;
            }
            iframe.style.height = h+'px';
        } catch (e) {}
    });
};
// 执行
crossDomainIframe('frame_content');

B页面:

(function(){
function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            oldonload();
            func();
        }
    }
}
function adjust() {
    var h = document.documentElement.scrollHeight || document.body.scrollHeight;
    try {
        if (document.getElementById('xclient')) {
            var divEl = document.getElementById('xclient').parentNode;
            console.log(document.getElementById('xclient').parentNode);
            divEl.parentNode.removeChild(divEl);
        }
        var el = document.createElement('div');
        el.innerHTML = '';
        document.body.appendChild(el);
    } catch(e) {}
}
addLoadEvent(adjust);
})();

C页面:空页面,有个文件避免404发生即可

标签:iframe,跨域,自适应,框架
0
投稿

猜你喜欢

  • 优雅地扩大链接响应区域

    2010-09-25 13:04:00
  • MySQL分页优化解析

    2008-12-22 14:56:00
  • border-radius与圆角

    2008-12-29 14:05:00
  • javascript阻止事件冒泡和浏览器的默认行为

    2007-12-28 13:13:00
  • 一空间多域名绑定不同目录方法

    2009-03-09 18:32:00
  • CSS3:文字阴影知多少

    2009-06-28 15:33:00
  • 如何测试字符串的长度?

    2009-11-11 20:02:00
  • 菜鸟课堂:MySQL权限的详细解答

    2009-09-03 11:43:00
  • asp 去除最后一个逗号为空字符串的代码

    2010-06-09 19:18:00
  • 防止表格或或div层被撑开的几种方法

    2008-01-01 15:33:00
  • 月影:function扩展

    2008-05-19 12:27:00
  • SQLServer 2000 升级到 SQLServer 2008 性能之需要注意的地方之一

    2012-02-25 19:44:26
  • 利用WSH获取计算机硬件信息、DNS信息等

    2008-05-05 13:04:00
  • MYSQL初学者扫盲

    2009-02-27 13:15:00
  • 让JavaScript拯救HTML5的离线存储[译]

    2009-05-15 12:26:00
  • 国外404错误页面的创意设计欣赏

    2007-08-19 15:44:00
  • 网页标准化-CSS命名规划整理

    2007-12-10 18:13:00
  • ASP用户登录验证代码

    2008-05-15 12:49:00
  • 手写个小组件(组件入门)asp版

    2013-06-01 20:29:25
  • asp中用insert into语句向数据库插入记录(添加信息)的方法

    2011-02-05 10:46:00
  • asp之家 网络编程 m.aspxhome.com