iframe全跨域高度自适应解决方案
作者:陈成 来源:经典论坛 发布时间:2008-12-21 16:16:00
标签:iframe,跨域,自适应,框架
看到这个需求的时候就在暗爽,又可以搞定一个知识点了。哈哈,一天的奋斗之后,果然有所收获,而且经过怿飞的指点,在跨域问题解决上还有所突破(不通过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发生即可


猜你喜欢
- 使用JS对Json数据的处理,项目遇到需要对Json数据进行相关操作,比如增删改操作,本以为会比较难,网上搜索下,发现还是比较简单的,贴一段
- 目录1.按照一列数值进行排序1.1按照五缺失值的一列进行排序1.1.1升序排列1.1.2 降序排列1.2按照有缺失值的一列进行排序1.2.1
- 基本概念gcache模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU性能损耗在ns纳秒级别。使用简单易上手,非常适合单机应用使用
- 前言:str转换为json格式,前提一定需要保证这个str的格式和json是一致的,即左边最外层是大括号,右边的最外层是大括号。如果不一致,
- 进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹;打开了python项目后,需要配置该项目对应的pytho
- 废话不多说,直接上代码吧!# -*- coding: utf-8 -*-import cv2import numpy as np# ----
- 1.如何构建应用框架一般来说构建应用框架包含3个部分:命令行参数解析配置文件解析应用的命令行框架:需要具备 Help 功能、需要能够解析命令
- echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print只
- 手残更新Pycharm 2020.1 版时将配置文件都删除了😂;在此重新记录下配置!安装教程参考:idea2020.1最新版永久破解/pyc
- 如下所示:import osimport timeimport subprocesssubprocess.Popen(r'cmd
- 简单介绍Mac下使用HomeBrew安装Python 3.*版本并设置为默认值1、首先查看Mac自带的python,可以看到是2.7.10的
- Keras的.h5模型转成tensorflow的.pb格式模型,方便后期的前端部署。直接上代码from keras.models impor
- 英文文档:classmethod(function)Return a class method for function.A class m
- window环境安装mysql5.7.21,具体内容如下1. 从MySQL官网下载免安装的压缩包mysql-5.7.21-winx64.zi
- 根据GB11643-1999公民身份证号码是特征组合码,由十七位数字本体码和一位数字校验码组成,排列顺序从左至右依次为:六位数字地址码八位数
- 环境内容:Pyhon版本:3.7.1scikit_learn==0.20.0graphviz==0.8.4numpy==1.15.3pand
- 一、简介我们在这里采用Python中的matplotlib来实现曲线图形的绘制。matplotlib是著名的python绘图库,它提供了一整
- /** * The maximum supported {@code LocalTime}, '23:59:59.999999999
- 登陆页login.asp:<% if request.Form.count>0 then ses
- 在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。一般来说