浏览器兼容问题项目总结(六) 页面嵌套多个iframe滚动条兼容性修改

本文转自:http://blog.csdn.net/u014744118/article/details/70792489
最近几天一直在chrome和IE的兼容性问题上花费较多时间,将我在iframe这个问题上的一个坑给大家做个分享。

iframes 提供了一个简单的方式把一个网站的内容嵌入到另一个网站中。但我们需要慎重的使用iframe。iframe的创建比其它包括scripts和css的 DOM 元素的创建慢了 1-2 个数量级。使用 iframe 的页面一般不会包含太多 iframe,所以创建 DOM 节点所花费的时间不会占很大的比重。但带来一些其它的问题:onload 事件以及连接池(connection pool)。
Iframes 阻塞页面加载
  及时触发 window 的 onload 事件是非常重要的。onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕。当 onload 事件加载延迟后,它给用户的感觉就是这个网页非常慢。window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 SRC 可以避免这种阻塞情况。
1、在项目中原本是用IE的最简单的赋值语句在IE中切换iframe可以正常使用,但是不兼容chrome。

document.all("frmPage").style.height = document.body.scrollHeight;

2、接着我尝试将赋值语句变为函数,但仍然不兼容

    function setIframeAutoAdaption(){  
        var $iframe = window.parent.$("#frmPage");  
        var height = $(document.body).height() + 20  
        $iframe.height(height);  
    }  

3、最后我花费了大约两天时间,查了很多资料,也发现是由于iframe页面中有浮动图表无法撑开body元素,导致(document.body)无法撑开body元素,无法获取body元素的总高度,最后修改了iframe高度获取方式为‘html’,使得页面正常显示(本系列文章只兼容IE7安全模式和chrome49)。

    function setIframeAutoAdaption() {  
        console.log('setIframeAutoAdaption' + $(document.body).height());  
        var navigatorName = "Microsoft Internet Explorer";  
        iframe = document.getElementById('frmPage');  
        var height  
        if (navigator.appName == navigatorName) {//IE  
            height = $(document.body).height() + 20;  
        } else {//chrome  
            height = $('html').height() + 20;  
        }  
        var $iframe = window.parent.$("#frmPage");  
        $iframe.height(height);  
    }  

并且将原来代码中重复调用了两次函数修改为调用一次,将函数放在初始化的页面的开始位置。
另附上javascript和jQuery获取高度宽度的方法

    javascript:  
    <pre code_snippet_id="2356829" snippet_file_name="blog_20170426_4_5242604" name="code" class="javascript">网页可见区域宽[仅针对body]: document.body.clientWidth  
    网页可见区域高[仅针对body]: document.body.clientHeight  
    网页可见区域宽[仅针对body]: document.body.offsetWidth (包括滚动条和边框,若滚动条和边框为0,则和clientWidth相等)  
    网页可见区域高[仅针对body]: document.body.offsetHeight (包括滚动条和边框,若滚动条和边框为0,则和clientHeight相等)  
    可视窗口宽度(包括滚动轴宽度):window.innerWidth; //IE9+、Chrome、Firefox、Opera 以及 Safari  
    可视窗口高度,不包括浏览器顶部工具栏: window.innerHeight;//IE9+、Chrome、Firefox、Opera 以及 Safari  
    网页正文全文宽(不包括滚动轴的宽度): document.body.scrollWidth  
    网页正文全文高:document.body.scrollHeight  
    //假如网页中没有滚动轴,document.body.scrollWidth和window.innerWidth相等,document.body.scrollHeight和window.innerHeight相等。  
    网页被卷去的高: document.body.scrollTop  
    网页被卷去的左: document.body.scrollLeft  
    网页正文部分上: window.screenTop  
    网页正文部分左: window.screenLeft  
    屏幕分辨率的高(整个屏幕的高度): window.screen.height  
    屏幕分辨率的宽(整个屏幕的宽度): window.screen.width  
    屏幕可用工作区高度: window.screen.availHeight  
    屏幕可用工作区宽度: window.screen.availWidth  
    整个浏览器可用工作区高度: window.outerHeight  
    整个浏览器可用工作区宽度: window.outerWidth</pre>jquery:<pre code_snippet_id="2356829" snippet_file_name="blog_20170426_5_6821948" name="code" class="javascript">alert($(window).height());                           //浏览器当前窗口可视区域高度  
    alert($(document).height());                        //浏览器当前窗口文档的高度  
    alert($(document.body).height());                //浏览器当前窗口文档body的高度  
    alert($(document.body).outerHeight(true));  //浏览器当前窗口文档body的总高度 包括border padding margin  
    alert($(window).width());                            //浏览器当前窗口可视区域宽度  
    alert($(document).width());                        //浏览器当前窗口文档对象宽度  
    alert($(document.body).width());                //浏览器当前窗口文档body的宽度  
    alert($(document.body).outerWidth(true));  //浏览器当前窗口文档body的总宽度 包括border padding margin</pre><pre code_snippet_id="2356829" snippet_file_name="blog_20170426_5_6821948" name="code" class="javascript">跨浏览器取得窗口左边和上边的位置:</pre><pre code_snippet_id="2356829" snippet_file_name="blog_20170426_5_6821948" name="code" class="javascript"><pre code_snippet_id="2356829" snippet_file_name="blog_20170426_5_6821948" name="code" class="javascript">var leftPos = (typeof window.screenLeft == "number") ?  
    window.screenLeft : window.screenX;  
    var topPos = (typeof window.screenTop == "number") ?  
    window.screenTop : window.screenY;</pre><br>  
    <br>  
    <pre></pre>  
    <pre></pre>  
    <pre></pre>  
    <pre></pre>      
    </pre>  

猜你喜欢

转载自blog.csdn.net/danruoshui315/article/details/77479288
今日推荐