移动端使用iframe碰到的那些坑

这里简单谈一下移动端h5编程中碰到的iframe的bug,具体详述如下:

在项目中,我主要使用iframe做弹出层,在iframe的外部放一层div,控制这个div,通过删除或追加div来决定是否使用iframe,iframe外层包div的做法也是很多博客里提倡用的做法。

页面结构如下:

<div class="iframe_pop_wrap">

<iframe scrolling="no" allowtransparency="true" name="pop_iframe" id="pop_iframe" src="demo_iframe.html" frameborder="0">

</iframe>

</div>

样式如下:

.iframe_pop_wrap{position: absolute;top:0;left:0;width:100%;bottom:0;z-index:11;
                 overflow-y: hidden;
      -webkit-overflow-scrolling: touch;
    box-sizing: border-box;

}
.iframe_pop_wrap iframe{position: absolute;top:0;left:0;width:100%;height:100%;overflow: hidden;background: transparent;}

 

 

在demo_iframe.html页面中页面布局如下:

<div class="modalCommonBg">
</div>

<div class="modalCommonBox">
</div>

我最开始时对modalCommonBg、modalCommonBox使用了一个fixed的定位方式,使用苹果手机打开时,弹窗全部消失了,我开始认识到在一个ios为操作系统的Safari浏览器或微信浏览器中,iframe的src所指向的页面内部不能使用fixed定位。于是,我开始想办法用绝对定位换掉固定定位。但当我使用absolute定位时,内容显示出来了,但是在页面的底部,有一部分内容消失了,由此我渐渐向着将内容展示出来的方向靠。在这个过程中,我将demo_iframe.html页面中设置了如下样式:

html {
        height: 100%;
        width: 100%;
        overflow:hidden;
    }

    body {
        height: 100%;
        width: 100%;
        overflow:hidden;
    }

在此之后,我发现页面的内容出现了。

当然在解决这个问题的过程中,我和同事商量也找到了一种用于替换iframe的方法,只需要做样式的隔离即可。

使用ajax方式请求一个div内部内容,这个div内部内容只要不含有<html>,<body><head>这三者即可。

$.ajax({
            url: '/package/sunglassSkuPanel.html?packageid=' + packageid + "&skuid=" + skuid,
            success: function (html) {
                var popupHTML = '<div class="popup popup-info-content">' + html + '</div>';
                $("body").append(popupHTML);
                GLOBAL['ctrlOverflow'].setHtmlOverflowHidden();
            }
        });

 至此,结束

 

posted on 2017-07-18 15:50  wts_crazy  阅读(1952)  评论(0编辑  收藏  举报