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 相关文章推荐
javascript中万恶的function实例分析
May 25 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
Sep 08 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
原生js仿淘宝网商品放大镜效果
Feb 28 Javascript
js canvas实现QQ拨打电话特效
May 10 Javascript
让你彻底掌握es6 Promise的八段代码
Jul 26 Javascript
微信小程序实现上传图片功能
May 28 Javascript
浅谈从React渲染流程分析Diff算法
Sep 08 Javascript
Vue 刷新当前路由的实现代码
Sep 26 Javascript
原生js实现购物车
Sep 23 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
vue ssr 指南详读
2018/06/29 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python lambda和Python def区别分析
2014/11/30 Python
用Python实现读写锁的示例代码
2018/11/05 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
Python 互换字典的键值对实例
2019/02/12 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
教育项目合作协议书格式
2014/10/17 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
优秀班集体申报材料
2014/12/25 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
用Python可视化新冠疫情数据
2022/01/18 Python
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
APP界面设计技巧和注意事项
2022/04/29 杂记