`

resize 事件的兼容性问题研究

阅读更多
先了解一下浏览器拖拉触发resize的方式。 
例如在xp的系统性能选项中,设置是否“拖拉时显示窗口内容”会有不同的拖拉效果: 
选择是的话,由于内容会跟着浏览器的拖拉同时渲染页面,导致resize事件的持续触发; 
选择否的话,内容在拖拉完成才会渲染,并触发resize事件,即在拖拉过程中resize事件只会在确定后才触发一次; 
不过ff有点特殊,即使选择否,它右下角的触发点还是会按照拖拉同时渲染页面的方式触发的。 
后面测试时建议选择否,会比较准确看到结果。 

再看看resize事件的支持情况。 
在ie,haslayout的块级和内联元素都支持onresize事件,其他浏览器只有window对象支持。 
而ie6/7跟ie8的支持程度也有不同,测试以下代码: 
Assembly code

<!doctype html>
<body>
<div id="show">0</div>
<div id="div" style="border:1px solid #000"></div>
<script>
var i = 0;
div.onresize = function(){ show.innerHTML = ++i; }
setTimeout('div.innerHTML="test"', 1000)
setTimeout('div.style.height="50px"', 2000)
</script>
</body>
</html>


在ie8两种情况都会触发onresize,但ie6/7只有第二种情况触发。 
鉴于情况比较复杂,程序在使用window作为容器时才绑定事件,其他情况请自行设置。 

resize事件有不少的问题,处理时要小心。 
chrome的resize有一个问题(bug?),每次触发resize都会执行两次事件,或者说会触发两次。 
而ie就复杂了,window, body和documentElement的resize会相互影响。 
在ie8测试以下代码: 
Assembly code

<!doctype html>
<style>html,body{border:5px solid #06F;}</style>
<body><div id="div" style="height:100px;"></div></body>
</html>
<script>
window.onresize = function(){ div.innerHTML += "window, "; }
//document.documentElement.onresize = function(){ div.innerHTML += "documentElement, "; }
//document.body.onresize = function(){ div.innerHTML += "body, "; }
</script>

当上下拖放时,onresize只会触发一次,但左右拖放时会触发两次。 
换成documentElement会有差不多的结果,两个一起用的话左右拖放时documentElement会触发两次,window一次。 
只设置body的话感觉就正常了,上下左右都只会触发一次。 
而documentElement和body同时设置的效果跟documentElement和window的效果差不多。 
如果window和body同时设置的话,后一个会覆盖前一个。 
看来window和body的onresize对应的是同一个对象事件,可能为了在body设置也能做到window一样的效果。 
个人推测,window和documentElement多出的一次,可能是同时触发了body的resize造成的。 
ps:onresize时,用srcElement获取不到触发元素,所以确定不了是哪个元素触发。 
ie7跟ie8的结果差不多,ie6就有些不同,不过估计也是盒模式的不同造成的。 
具体产生原因还不清楚,这里我也很糊涂。 

虽然问题弄不清楚,解决方法还是有的。 

要绑定resize就是因为视框范围发生了变化,要重新设置视框范围,那么可以通过看两次resize之间视框范围有没有变化来确实是否执行程序。 
在上次写的Lazyload效果中,就是通过clientWidth和clientHeight来判断的: 
Assembly code

this.resizeDelay = function(){
    var clientWidth = container.clientWidth,
        clientHeight = container.clientHeight;
    if( clientWidth != width || clientHeight != height ) {
        width = clientWidth; height = clientHeight;
        oThis._delay( oThis.resize );
    }
};


ps:如果只需针对window,直接用innerHeight/innerWidth就不用理会文档模式了。
分享到:
评论

相关推荐

    ImageAutosizer_image_resize_UserJS_源码.rar

    7. **兼容性处理**:源码还需要考虑不同浏览器的兼容性问题,可能包含针对各种浏览器特性的条件判断,以确保在各种环境下都能正常工作。 8. **异常处理**:在调整图片大小的过程中,可能出现各种意外情况,比如图片...

    兼容IE8的jQuery瀑布流代码.zip

    在IT行业中,jQuery是一款广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画设计和Ajax交互等...它不仅展示了jQuery在处理复杂布局时的能力,也提醒我们在进行前端开发时应考虑到各种浏览器的兼容性问题。

    jQuery实现的3D响应式菜单导航特效源码.zip

    例如,它可能会提醒用户需要引入jQuery库,或者说明如何将代码集成到自己的项目中,以及可能存在的浏览器兼容性问题等。遵循这些指导,开发者可以更顺利地将3D菜单特效应用到实际项目中。 总的来说,jQuery实现的3D...

    窗口位置确定特效.zip

    5. **跨浏览器兼容性**:由于不同的浏览器可能对某些JavaScript特性支持程度不一,所以这个API可能考虑到了各种浏览器的兼容性问题,确保在主流浏览器上都能正常工作。 6. **CSS定位**:JavaScript可能配合CSS的...

    08-瀑布流插件.zip

    8. **兼容性处理**:JavaScript的特性在不同浏览器中可能存在差异,需要关注IE等老旧浏览器的兼容性问题。对于某些不支持的特性,如CSS3选择器或Flexbox,可以借助polyfill库来弥补。 9. **插件化设计**:为了让...

    jQuery实现右下角浮动可拖动广告窗口特效源码.zip

    这使得代码更简洁,减少了跨浏览器的兼容性问题。 在这个广告窗口特效中,jQuery被用来创建一个在页面右下角浮动的元素。这通常涉及到CSS定位技术,如绝对定位(position: absolute)和相对定位(position: ...

    5个极炫JS特效+代码

    在实际应用中,还要注意性能优化,避免过多的DOM操作导致页面卡顿,以及兼容性问题,确保特效在不同浏览器和设备上都能正常工作。 总的来说,通过学习和实践这些JS特效,开发者可以提升自己的前端技能,为网站添加...

    JavaScript特效代码集.rar

    9. **浏览器兼容性处理**:由于不同的浏览器对某些特性支持程度不同,开发者需要编写兼容性代码。代码集可能包含了如何使用条件注释、Modernizr等工具来解决这个问题。 10. **性能优化**:优化JavaScript代码对于...

    jquery easyui 1.4 API(帮助文档)

    8. **兼容性**:jQuery EasyUI 1.4 API还涵盖了与jQuery版本的兼容性信息,以及对不同浏览器的支持情况,确保在多环境下稳定运行。 9. **问题解决**:文档还可能包含常见问题解答和解决方案,帮助开发者解决在使用...

    html5横版手游飞机大战源码

    HTML5是一种在网页上创建动态内容的标记语言,具有跨平台兼容性,可以在不同的设备和浏览器上运行,无需安装插件或应用程序,这使得HTML5成为开发移动游戏的热门选择。 本源码的核心知识点包括: 1. **Canvas元素*...

    torch_sparse-0.6.5-cp36-cp36m-win_amd64whl.zip

    这一步是必要的,因为不同版本的PyTorch与torch_sparse可能存在兼容性问题,可能导致导入错误或者运行效率低下。 在安装过程中,`whl`文件是一种预编译的Python二进制包,可以直接通过pip进行安装。例如,你可以...

    锋利的jQuery代码随书光盘demo代码

    10. **版本兼容性**:jQuery的跨浏览器兼容性是其广受欢迎的原因之一。Demo代码会展示如何确保在多种浏览器环境下保持一致的行为。 通过研究《锋利的jQuery》随书光盘中的Demo代码,读者不仅可以加深对jQuery的理解...

    基于ElementUI二次封装的支持自适应列宽的tablecolumn列组件

    这可能涉及到DOM操作和事件监听,如`window.resize`事件,以确保窗口大小变化时列宽也能相应调整。 2. **比例分配**:将表格总宽度按比例分配给各个列。可以设定权重值,权重高的列分配到的宽度更大。这种方式需要...

    jquery特效 自动滚动瀑布流

    浮动布局在旧版浏览器中兼容性较好,而Flexbox和Grid则更适合现代浏览器,提供了更灵活的控制和更好的响应式设计。 3. **JavaScript/jQuery插件**:虽然可以通过原生JavaScript编写代码实现瀑布流,但更常见的是...

    Android 软键盘切换表情不会闪动

    在Android开发中,用户界面(UI)的交互体验是至关重要的,尤其是涉及到输入法和键盘交互时。"Android 软键盘切换表情...在实际开发中,还需要关注不同设备和Android版本之间的差异,确保解决方案的兼容性和稳定性。

    原创jQuery弹出层插件分享

    最后,通过阅读插件的源代码,我们可以学习到如何组织代码、如何处理跨浏览器兼容性问题以及如何利用jQuery进行DOM操作和事件处理。这个插件虽然是一个简单的例子,但它包含了许多编写高效和可重用jQuery插件的关键...

    VB-实现半透明窗体(利用API)

    在实际编程中,还需要考虑兼容性、性能优化等问题,确保代码的稳定性和效率。这个压缩包文件中的“半透明窗体”应该包含了实现上述功能的源代码,供你参考和学习。通过研究这些代码,你可以更深入地理解API函数在VB...

    torch_sparse-0.6.15-cp310-cp310-macosx_10_15_x86_64.whl.zip

    这是因为不同版本的PyTorch可能与`torch_sparse`存在兼容性问题,提前安装指定版本的PyTorch可以避免后续出现运行错误。 安装`torch_sparse`的方法通常有两种:通过pip或手动安装。对于提供的`.whl`文件,这是一种...

    jquery实现的简单图片列表瀑布流布局代码.zip

    这些插件可以帮助简化代码,提供更好的性能和兼容性。 在实际项目中,开发者应当注意性能优化,比如使用延迟加载(lazy loading)减少初次加载时的数据量,以及合理使用CSS3的硬件加速来提升动画性能。同时,确保...

    漂亮的js及jquery幻灯效果

    例如,使用 `$.each()` 遍历幻灯片数组,`fadeIn()` 和 `fadeOut()` 实现过渡效果,`$(document).ready()` 确保在页面加载完成后执行代码,`$(window).resize()` 处理窗口大小改变时的适应性问题。 在文件列表中的 ...

Global site tag (gtag.js) - Google Analytics