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读写XML实现广告轮换(兼容IE、FF)
Aug 09 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
node.js中的fs.open方法使用说明
Dec 17 Javascript
Node.js中调用mysql存储过程示例
Dec 20 Javascript
DIV+CSS+jQ实现省市联动可扩展
Jun 22 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
浅谈Node.js:fs文件系统模块
Dec 08 Javascript
js 实现在2d平面上画8的方法
Oct 10 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 Javascript
django js 实现表格动态标序号的实例代码
Jul 12 Javascript
jquery实现的分页显示功能示例
Aug 23 jQuery
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
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
在项目中寻找代码的坏命名
2012/07/14 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python2.7到3.x迁移指南
2018/02/01 Python
Python实现的质因式分解算法示例
2018/05/03 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
工程师岗位职责规定
2014/02/26 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS