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 相关文章推荐
通过Mootools 1.2来操纵HTML DOM元素
Sep 15 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
Jun 29 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
js判断客户端是iOS还是Android等移动终端的方法
Dec 11 Javascript
javascript中全局对象的isNaN()方法使用介绍
Dec 19 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
js断点调试经验分享
Dec 08 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
Feb 08 Javascript
vue 组件高级用法实例详解
Apr 11 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
vue.js实现双击放大预览功能
Jun 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
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
JS常用知识点整理
2017/01/21 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
Python标准异常和异常处理详解
2015/02/02 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python实现随机漫步算法
2018/08/27 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
货车司机岗位职责
2014/03/18 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
社会工作专业求职信
2014/07/15 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
作风建设剖析材料
2014/10/06 职场文书
2014年团总支工作总结
2014/11/21 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书