IE8下IFrame 和子页面的通信

业务中遇到这种场景,我们的业务嵌入别的系统中使用,系统采用Iframe调用我们的业务,在使用过程中主要遇到两个问题:

1。子页面高度发生变化时外部的Iframe高度自适应的问题。

2。子页面不同获取外部scrollTop的问题。

这两个问题其实都可以说是跨域通信的问题。

这两个问题我们采用了不同不同的方案来解决。

1。子页面高度发生变化时外部的Iframe高度自适应的问题。

我们采用在外部系统中增加一个代理页面,这样的话这个代理页面就和外部系统处于同一个域中了,相当于我们在外部系统中安插了一个内鬼,使用这个代理页面来调整外部Iframe的高度。

代码实现

window.setInterval("proxyHeight()", 400);//每隔400毫秒监听下页面高度(其实就是我们子页面的高度)
var pageHeightPre = 0;
function proxyHeight() {
    var proxyUrl = Rose.browser.getParameter(‘proxyUrl‘);//获取代理页面的URL
    if (proxyUrl != null){

        var height = document.documentElement.scrollHeight;
        if(Rose.browser.ie){
            height = document.body.scrollHeight;
        }
        if(height <= 0) {
            return;
        }
        if (height < 450) {
            height = 450;
        }

        if(height != 0 && pageHeightPre != height){
            pageHeightPre = height;
            document.getElementById(‘proxyFarme‘).src= proxyUrl +‘?proxyHeight=‘+height;
        }
    }
}

代理页面的代码大致是这样的

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="./js/common/Rose/1.0.0/Rose.src.js"></script>
</head>
<body>
</body>
</html>
<script type="text/javascript" >
window.onload = function(){
    var proxyHeight = Rose.browser.getParameter(‘proxyHeight‘);
    if(proxyHeight != null){
        parent.parent.reinitIframe(proxyHeight);//调用系统的reinitIframe方法
} } </script>

reinitIframe方法的逻辑较简单

function reinitIframe(height) {
        var iframe = $(".ui-navtab-iframe:visible").find("iframe");
        $(iframe).height(height);
    }

这种方式也能满足我们业务需要。

2。子页面不同获取外部scrollTop的问题,这个问题我们采用postMessage的方式。

在外部系统中我们监听滚动条的事件

$(window).scroll(function(event){
    var iframe = $(".ui-navtab-iframe:visible").find("iframe");
    if(iframe.length == 0){
        return;
    }
        var scrollHeight = $(document).scrollTop()
        scrollHeight = JSON.stringify({‘scrollHeight‘: scrollHeight});
        iframe[0].contentWindow.postMessage(scrollHeight, "*");

    });

在子业务中接受消息

function receiveMessage(e){
    if (e != null && e != undefined && e.data != undefined ){
        if(typeof(e.data) == "string"){
            try{
                var data = JSON.parse(e.data);
                if(data.scrollHeight != null && data.scrollHeight != undefined){
                    window.iframScrollHeight = data.scrollHeight;
                }
            }catch(e){
            }
        }
    }
}
attachEventListener("message",receiveMessage);
function attachEventListener(type, listener){
    if(window.addEventListener){ // 兼容所有浏览器除了ie9以下
        window.addEventListener(type, listener, false);
    }else if(window.attachEvent){ // 兼容ie9以下浏览器
        window.attachEvent("on"+type, listener);
    }
}

这样的话只要外部的滚动条有变化就会发送滚动条目前高度的消息,子页面接收到消息后 就能获取到外部的滚动条的高度了,也能满足业务需要。

美中不足的是目前的写法是实时监听,不过也可以修改为子页面发送消息给外部Iframe ,使之获取滚动条的高度后在发消息给子页面。各有优劣吧。

时间: 2024-11-07 02:02:24

IE8下IFrame 和子页面的通信的相关文章

跨域IFRAME自适应高度(子页面TAB切换不同的高度,主页面IFRAME嵌套子页面自适应高度)

1.pinganproxy.html <!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8"><title></title></head><body><script type="text/javascript">eval(function(p,a,c,k,e,r){e=fu

iframe根据子页面的内容来设置高度

以下的方法必须起一个页面服务才能使用(通过域名或ip地址来访问)并且的保证父页面与子页面是在同一域名下,不然是会报错的 contentDocument 可以获得iframe子窗口的document对象,兼容ie8+ contentWindow    这是个只读属性,返回指定的iframe的窗口对象. 在iframe加载完毕之后通过contentDocument 或者 contentWindow 这个对象来获取iframe子页面的内容高度,从而来设置设置iframe的高度.再给iframe设置高度

主页面获取iframe 的子页面方法。

父页面parent.html <html> <head> <script type="text/javascript"> function say(){ alert("parent.html"); } function callChild(){ myFrame.window.say(); myFrame.window.document.getElementById("button").value="调

Bootstrap 模态框 + iframe &gt; 打开子页面 &gt; 数据传输/关闭模态框

父页面bootstrap模态框: <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false" > <div class="modal-dialog modal-lg"> &l

使用iframe框架后的页面跳转时目标页面变为iframe的子页面的问题

<frameset rows="4,200,10,*,120" cols="*" framespacing="0" frameborder="no" border="1" > <frame src=""/> <frame src="<%=practiceInfoSrc %>" id="practiceInfo&quo

iframe根据子页面自动调整大小

//iframe高度自适应 function IFrameReSize(iframename) { var pTar = document.getElementById(iframename); if (pTar) { //ff if (pTar.contentDocument && pTar.contentDocument.body.offsetHeight) { pTar.height = pTar.contentDocument.body.offsetHeight; } //ie e

IE8 下 iframe 滚动条的问题

//设置滚动条                $("iframe[name='updateFocalWork']").attr("scrolling", "yes").css("overflow-y", "auto").css("overflow-x", "hidden"); 无法将默认scrolling为no 的iframe修改属性,导致无法显示滚动条.

html中iframe根据子页面内容动态修改高度

JavaScript var browserVersion = window.navigator.userAgent.toUpperCase(); var isOpera = browserVersion.indexOf("OPERA") > -1 ? true : false; var isFireFox = browserVersion.indexOf("FIREFOX") > -1 ? true : false; var isChrome = br

父子页面之间元素相互操作(iframe子页面)

js/jquery获取iframe子页面中元素的方法: 一.使用window.frames["iframe的ID"]获取元素 window.onload = function() { var oIframe = window.frames["oIframe"].document.getElementById("getFrame"); console.log(oIframe); } 注意:此处一定要加上window.onload或者DOMConte