浏览器兼容问题项目总结(六) 页面嵌套多个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>