浏览器兼容问题项目总结(六) 页面嵌套多个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>  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要监听嵌套iframe的滚动事件,你可以先通过JavaScript获取到嵌套iframe元素,然后给它添加scroll事件监听器。但是需要注意的是,由于同源策略的限制,你只能监听和操作同源的iframe。 以下是一个示例代码: ```javascript // 获取iframe元素 var iframe = document.getElementById('my-iframe'); // 给iframe添加滚动事件监听器 iframe.contentWindow.addEventListener('scroll', function() { // 处理滚动事件 console.log('iframe滚动了'); }); ``` 其中,`my-iframe` 是你iframe元素的id。在添加滚动事件监听器时,使用 `contentWindow` 属获取到iframe的window对象,然后给它添加监听器即可。 需要注意的是,如果iframe页面中也有滚动条,那么需要在iframe内部添加滚动事件监听器,然后将滚动事件传递给父级页面。可以使用 `postMessage` 方法来将事件传递给父级页面。具体实现可参考以下代码: 在iframe页面中添加以下代码: ```javascript // 给iframe内部的元素添加滚动事件监听器 var iframeContent = document.getElementById('my-iframe').contentWindow.document.body; iframeContent.addEventListener('scroll', function() { // 将滚动事件传递给父级页面 window.parent.postMessage('iframe-scroll', '*'); }); ``` 在父级页面中添加以下代码: ```javascript // 监听来自iframe的滚动事件 window.addEventListener('message', function(event) { if (event.data === 'iframe-scroll') { // 处理滚动事件 console.log('iframe滚动了'); } }); ``` 在父级页面中,通过监听 `message` 事件来接收来自iframe的滚动事件,然后处理即可。需要注意的是,为了避免跨域安全问题,需要在 `postMessage` 方法中指定正确的目标源。如果你将 `'*'` 作为目标源,那么任何页面都可以接收到该消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值