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 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
VBS通过WMI监视注册表变动的代码
Oct 27 Javascript
JS模块与命名空间的介绍
Mar 22 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 Javascript
js中this用法实例详解
May 05 Javascript
Javascript中的方法和匿名方法实例详解
Jun 13 Javascript
深入浅析AngularJS中的module(模块)
Jan 04 Javascript
AngularJS单选框及多选框实现双向动态绑定
Jan 13 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
Mar 03 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
vue-router 控制路由权限的实现
Sep 24 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
js读写json文件实例代码
2014/10/21 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
Python中__new__与__init__方法的区别详解
2015/05/04 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
Django框架反向解析操作详解
2019/11/28 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
python 检测图片是否有马赛克
2020/12/01 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
一些Solaris面试题
2015/12/22 面试题
laravel使用redis队列实例讲解
2021/03/23 PHP
幼儿师范毕业生自荐信
2013/11/09 职场文书
中医专业应届生求职信
2013/11/17 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
论文评语大全
2014/04/29 职场文书
三八活动策划方案
2014/08/17 职场文书
自我检讨书范文
2015/01/28 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS