• 酷版移动端iframe改变src,重新加载页面问题探究


      最近在酷版上我要做一个内嵌别人的网页的在线服务页面,于是必须用到iframe,以前我以为移动端不支持iframe呢,原来这样都可以。。。。(呵呵,长见识了!我还是只菜鸟)

    直接入正题,说说我遇到的困难或者说是我需要解决的问题:

    1、重构人员提供页面之后,我给页面上的iframe设置一个src属性,发现那个页面根本不能上下滑动。我就到处搜,有的人说酷版移动端iframe里面不会像pc端一样自动产生滚动条,我真的信了!于是我不得不让产品去和即将上线的几个合作方谈一下,让他们在页面里设置一个document.domain,然后在body上注册一个onload事件,页面加载完成后设置iframe的高度,这样即使iframe没有自动产生滚动条有了固定高度也能够看到所有页面。内嵌页面内容html如下

    <body onload="setParentIframeHeight()">
    <div class="wraper">内容...</div>    
    
    <script>
    function setParentIframeHeight(){
        document.domain=window.location.host.match(/[^.]+.[^.]+$/)[0];
        parent.document.getElementById('serviceBody').style.height = window.document.body.scrollHeight + "px";
      }
    </script>
    </body>

    这样做能解决问题,但是大大限制了能接入的页面的数量。

    但是后来仔细看了一下下面的html,原来我被重构人员坑了,他给iframe加了一个scrolling = "no",这让伦家怎么出现滚动条啊!

    <article id="serviceContent" style="100%;height:100%;">
        <iframe id="serviceBody" width="100%" height="100%" frameborder="0" scrolling="no"></iframe><!--可能需JS计算高度    height="100%" -->
    </article>

      

    2、iframe内两个页面切换的问题

    要切换iframe里的页面很简单,只要改变iframe的src属性值就可以了,有两种方式改变:

    第一种:

    document.getElementById('iframeId').src = "http://www.baidu.com";

    第二种:

    document.getElementById('iframeId').contentWindow.location.href = "http://www.sina.com.cn/";

      但是有个问题,就是用这两种方式改变iframe里的页面地址,并不会重新加载页面,也就是不会触发body的onload事件,导致切换页面的时候滚动条没有回到最上面,所以只是在第一次创建那个iframe的时候才触发了一次,后面的页面都没有触发body的onload,找了好久都没结果,没办法只能使用绝招,把iframe一起干掉,既然改变src不会刷新页面,那么就每次都重新创建一个iframe,这样才终于解决了问题。

    function createNewpage(container,newSrc) {
                var self = this;
    
                var iframe = document.createElement("iframe");
                iframe.src = newSrc;
                iframe.id = "serviceBody";
                iframe.style.width = "100%";
                iframe.style.height = "100%";
                container.appendChild(iframe);
    
                if (window.navigator.userAgent.indexOf('IE') == -1) { //非IE的浏览器
                    iframe.onload = setIframe;
                } else {
                    iframe.onreadystatechange = function() { //IE浏览器
                        if (iframe.readyState == 'complete') { //判断状态
                            setIframe();
                        }
                    }
                }
    
                function setIframe(){
                    doSomething else;
                }
    }

    上面的代码是参照这个改的:http://xiaogai1010.blog.163.com/blog/static/13717030820135932746318/

    悟已往之不谏,知来者之可追;实迷途其未远,觉今是而昨非。 ——且行且珍惜
  • 相关阅读:
    maxProfit2
    maxProfit
    getRow
    generate
    hasPathSum
    minDepth
    isBalanced
    sortedArrayToBST
    不得不学的 TCP三次握手和四次挥手
    java生态框架、中间件该有的都有了
  • 原文地址:https://www.cnblogs.com/jq-melody/p/4126062.html
Copyright © 2020-2023  润新知