• iframe 自适应高度


    最近做到这样的项目,自己实现了一下

    场景是 跨域 子页面动态高度的

    自己的实现用到了 postMessage 和 跨域 代理 iframe  。

    参考了这篇博客的内容,记录一下,有空再完善一下具体方案。 

     每半秒钟检测一下子页面高度,是否有变化,如果变化发送信息到主域。

    it.e.addEventListener(window,'load',function(){
            
        it.winHeight = it.getHeight();
        try{postMsg('setHeight|'+it.winHeight);}catch(e){};    
        setInterval(function(){
                try{
                    if(it.winHeight != it.getHeight()){
                        it.winHeight = it.getHeight();
                        postMsg('setHeight|'+it.winHeight);
                        }else{
                            //console.log(it.winHeight)    
                            }
                    }catch(e){};
                },5E2);
                
            

            }); 

     postMsg 的实现:

     支持postMessage 的 调用postMessage 不支持的IE6 IE7 用iframe代理,通过调取主域下的js_proxy.html+search值 传输信息到主域。 

    function postMsg(msg) { 
      if(window.parent.postMessage) { 
         window.parent.postMessage(msg, hostDomain); 
      } else {
         // alert(msg);
        var proxy = hostDomain+'/js_proxy.html?',
            frame = document.getElementById('js_proxy');
        var clear = function(f){
                try{
                    f.contentWindow.document.write('');
                    f.contentWindow.close();
                    document.body.removeChild(frame);
                }catch(e){}
            }; 
        if(frame){
            clear(frame);
            };             
        frame = document.createElement('iframe');
            document.body.appendChild(frame);
            frame.id = "js_proxy"
            frame.style.display = 'none';
        frame.name = msg;
        frame.contentWindow.location = proxy+msg;
      }; 

     }; 

    接收数据和执行的实现:

     主域中的脚本,接收message

    if(window.postMessage) { 
      if(typeof window.addEventListener != 'undefined') { 
        window.addEventListener('message', onmessage, false); 
      } 
      else if(typeof window.attachEvent != 'undefined') { 
        window.attachEvent('onmessage', onmessage); 
      } 

    };

    主域下的js_porxy.html?msg  通过分析 location.search 来接收数据并处理。

     var hash = window.location.search.toString().substring(1);

            //alert('trance'+hash);
            var msg = hash,func = msg.split('|')[0] , parm = msg.split('|')[1];
             if(func == 'setHeight'){
                parent.parent.window.document.getElementById('thridparty').height = parm;
                };

     通过hash 也可以,但是 不知道为何在实现的时候 出现莫名其妙的hash被截断的情况,改用search解决。 

  • 相关阅读:
    [linux1exe元旦特供]基于wine的IE6一键安装
    http://www.tianya.cn/publicforum/content/funinfo/1/1869814.shtml
    最全的design pattern 概述
    例解 autoconf 和 automake 生成 Makefile 文件
    根据条件分组SQL
    SQL Express自动备份
    通过asp.net 短信猫发短信
    EXT.NET GridPanel(按键事件带参的另一种写法)
    Asp.net操作IIS(调试通过)
    面向接口编程详解——编程实例(T2噬菌体)
  • 原文地址:https://www.cnblogs.com/trance/p/2345215.html
Copyright © 2020-2023  润新知