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 相关文章推荐
jQuery网页选项卡插件rTabs用法实例分析
Aug 26 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
AngularJS表格详解及示例代码
Aug 17 Javascript
jQuery实现div跟随鼠标移动
Aug 20 jQuery
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
让网站自动生成章节目录索引的多个js代码
Jan 07 Javascript
自定义javascript验证框架示例【附源码下载】
May 31 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
Mar 24 Javascript
vue 内联样式style中的background用法说明
Aug 05 Javascript
如何检测JavaScript中的死循环示例详解
Aug 30 Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 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获取服务器操作系统相关信息的方法
2016/10/08 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
js实现碰撞检测
2021/01/29 Javascript
python中pygame模块用法实例
2014/10/09 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
python:接口间数据传递与调用方法
2018/12/17 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
如何使用Python调整图像大小
2020/09/26 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
毕业生优秀推荐信
2013/11/26 职场文书
六一儿童节主持词
2014/03/21 职场文书
入职担保书范文
2014/05/21 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
反邪教观后感
2015/06/11 职场文书