JavaScript实现iframe自动高度调整和不同主域名跨域


Posted in Javascript onFebruary 27, 2016

 大家都知道Js有同源策略,就是主域名不同嵌套的iframe不允许Js通信的。

比如我有一个网站,网站中要嵌入其网站的页面。那么我可以使用iframe引用第三方网站的地址即可。

但是问题也来的iframe的高度是固定的不能与第三方网站很好的融合,又例如第三方网站使用了瀑布流插件,要滚动加载自动计算高度,那么先说跨域:iframe主域名不同跨域方法,假如网站 A.com  B.com   A 里面放入一个iframe 引用了B.com,这种情况下B.com里面的Js是无法访问到A.com的。JS跨域必须是同源,就是同一个主域名,那肿么办呢?

我们可以在B.com中在引入一个iframe,暂且叫C吧 这个iframe加载A.com中的一个网页。这样同源就有了B.com中的iframe中的网页就可以和A.com通讯了。下面只要B和C通讯,让C和A通讯就完成B->A通讯,这样当B高度变化时通知C,让C通知A把iframe高度调整。
B和C通讯,其实通过url地址就可以实现通讯了,B.com iframe设置为隐藏,改变src地址时候C就可以接收。

废话不说了上代码

A.com/index.html

<html>
  <script src="{$smarty.const.STATIC_URL}/js/jquery-1.7.1.min.js"></script>
  <script>
   var test = function() {
     $('#h1').html('test');
   }
   </script>
<body>
<h1 id="h1">nba.alltosun.net</h1>
<iframe id="ifm" width="760" height="100" src="http://***.sinaapp.com/"></iframe>
</body>
</html>

B.com/index.html

<html>
<head></head>
<body>
  <h1>**.appsina.com</h1>
  <button id="button">设置高度</button>
  <div id="div" style="height:200px;display:none;"></div>
  <script src="http://nba.alltosun.net/js/jquery-1.7.1.min.js"></script>
  <script>
  $(function(){
    window.ifrH = function(e){
      var searchUrl = window.location.search;
      var b = null;
       
      var getParam = function(url, param) {
        var q = url.match(new RegExp( param + "=[^&]*")),
        n = "";
        if (q && q.length) {
          n = q[0].replace(param + "=", "");
        }
        return n;
      }
       
      var f = getParam(searchUrl,"url"),
        h = getParam(searchUrl, "ifmID"),
        k = getParam(searchUrl, "cbn"),
        g = getParam(searchUrl, "mh");
       
 
      var iframeId = 'testiframe';
      var iframe = document.getElementById(iframeId);
      var divId = 'alltosun';
       
      if (!iframe){
        var iframe = document.createElement('iframe');
        iframe.id = iframeId;
        iframe.style.display = "none";
        iframe.width = 0;
        iframe.height = 0;
        document.body.appendChild(iframe);
      }
       
      if (e && e.type == "onload" && h) {
        b.parentNode.removeChild(b);
        b = null;
      }
       
      if (!b) {
        b = document.createElement("div");
        b.id = divId;
        b.style.cssText = "clear:both;"
        document.body.appendChild(b);
      }
       
      var l = b.offsetTop + b.offsetHeight;
      iframe.src = (decodeURIComponent(f) || 
          "http://*****/test2") + "&h=" + l + "&ifmID=" + (h || "ifm") + "&cbn=test" + "&mh=" + g + "&t=" + ( (+ new Date()));
       
      if (e && e.type =="onload") {
        window.onload = null;
      }
    }
     
    window.onload = function() {
      ifrH({type: "onload"});
    }
     
    // ifrH();
    $('button').click(function(){
      $('div').show();
      ifrH();
    })
  })
  </script>
</body>
</html>

C 代理文件

<script>
var search = window.location.search,
getSearchParam = function (search, key) {
  var mc = search.match (new RegExp ( key + "=([^\&]*)") ),
    ret="";
  mc && mc.length && (ret = mc[0].replace( key + "=",""));
  return ret;
},
// 参数h 
h = getSearchParam(search,"h"),
ifmID = getSearchParam(search,"ifmID"),
cbn = getSearchParam(search,"cbn"),
// 宽高
mh = getSearchParam(search,"mh") || h,
isFunction = function(fn){
  return !!fn && !fn.nodeName && fn.constructor != String 
      && fn.constructor != RegExp && fn.constructor != Array 
      && (/function/i).test(fn + "");
};
 
try{
  if(parent && parent.parent){
    ifm = parent.parent.document.getElementById(ifmID);
    ifm && mh && (ifm.height=mh);
    fn=parent.parent[cbn];
    isFunction(fn) && fn.call();
    ifm=null;
  }
}catch(ex){
  console.log(ex);
}
 
</script>
Javascript 相关文章推荐
用js计算页面执行时间的函数
Dec 07 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
Javascript合并表格中具有相同内容单元格示例
Aug 11 Javascript
js Date概念详细介绍
Nov 22 Javascript
js实现在网页上简单显示时间的方法
Mar 02 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 Javascript
yarn与npm的命令行小结
Oct 20 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
TypeScript之调用栈的实现
Dec 31 Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 #Javascript
javascript的 {} 语句块详解
Feb 27 #Javascript
javascript中eval解析JSON字符串
Feb 27 #Javascript
javascript先序遍历DOM树的方法
Feb 27 #Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 #Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
Feb 27 #Javascript
JS原型、原型链深入理解
Feb 27 #Javascript
You might like
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
python计算一个序列的平均值的方法
2015/07/11 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
python中封包建立过程实例
2021/02/18 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
2014年元旦促销活动方案
2014/02/22 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
中班开学寄语
2014/04/04 职场文书
借款协议书范本
2014/04/22 职场文书
五水共治一句话承诺
2014/05/30 职场文书
公司开除员工通知
2015/04/22 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
MySQL创建管理KEY分区
2022/04/13 MySQL