浏览器缩放不触发window.onresize事件的BUG

在帮同事处理一个页面缩放BUG的时候惊奇的发现各种浏览器的缩放不触发window.onresize的BUG,太坏了!

我理解的能正常工作的浏览器有:

IE6
FF3

以下浏览器Ctrl+和Ctrl-时均不触发window.onresize事件,只在窗口大小改变时才触发:

IE8 Beta2,无论是Ctrl+,Ctrl-还是最大化最小化,拖拽改变窗口大小,都无法触发window.onresize事件,真是彻底失效了!

Opera 9.52
Chrome 0.2.149.30
Netscape 9.0.0.6
Mozilla 1.7.13
Safari 3.1.2(525.21)
FF2.x

修正的BUG:

page中有width:auto的区块,当缩放字体大小时,该区块大小不能自动更新!

<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3c.org/tr/html4/strict.dtd">
<html>
<head>
<title>wind</title>
<style type="text/css">
html,body {margin:0;padding:0;}
#x {background:red;}
#y {width:76em;}
</style>
<script type="text/javascript">
var eve = {
    bindEvent:function(d,e,f,c){
        if(d&&f){
            if(document.attachEvent){
                if(!!d.length){
                    for(var i=0,l=d.length;i<l;i++) d.attachEvent('on'+e,f);
                }else{
                    d.attachEvent('on'+e,f);
                }
            }else{
                if(d.length){
                    for(var i=0,l=d.length;i<l;i++) d.addEventListener(e,f,c);
                }else{
                    d.addEventListener(e,f,c);
                }
            }
        }
    },
    removeEvent:function(d,e,f,c){
        if(d&&f){
            if(document.attachEvent){
                if(!!d.length){
                    for(var i=0,l=d.length;i<l;i++) d.detachEvent('on'+e,f);
                }else{
                    d.detachEvent('on'+e,f);
                }
            }else{
                if(!!d.length){
                    for(var i=0,l=d.length;i<l;i++) d.removeEventListener(e,f,c);
                }else{
                    d.removeEventListener(e,f,c);
                }
            }
        }
    }
}
var rs = function(objID){
    var ow = document.documentElement.scrollWidth;
    var objID = objID;
    var times = 0;
    var set = function(){
        times += 1;
        var xx = document.getElementById(objID);
        var w = document.documentElement.scrollWidth;
        xx.style.width = (w>ow)?w+'px':(!/MSIE/s6/.0/.test(navigator.userAgent))?w+'px':(w==ow)?'auto':w+'px';
        if(times>2){
            times = 0;
            eve.removeEvent(window,'resize',rs,false);
            window.setTimeout(function(){eve.bindEvent(window,'resize',rs,false)},0);
        }
    }
    return function(){
        var xx = document.getElementById(objID);
        xx.style.width = ow+'px';
alert(ow);
        window.setTimeout(set,0);
    }
}('x');
eve.bindEvent(window,'resize',rs,false);
</script>
</head>
<body>
    <div id="x">
        M A S T H E A D
    </div>
    <div id="y">
    <script>document.write(new Array(1000).join('囧'));</script>
    </div>
</body>
</html>
转载请注明出处:http://www.v-ec.com/dh20156/article.asp?id=186

### window.onresizewindow.addEventListener('resize') 的区别 #### 1. **绑定方式** `window.onresize` 是通过直接设置 `onresize` 属性来绑定事件处理程序。这种方式只允许一次绑定一个事件处理器,如果多次赋值,则后面定义的会覆盖前面的[^2]。 而 `window.addEventListener('resize', callback)` 则允许多次绑定同的回调函数到同一个事件上,会相互覆盖[^5]。 #### 2. **灵活性** 使用 `addEventListener` 提供了更高的灵活性,可以指定第三个参数(选项对象),用于控制捕获阶段、被动监听器等特性。例如: ```javascript window.addEventListener('resize', handler, { capture: true, passive: true }); ``` 相比之下,`onresize` 支持这些高级配置[^3]。 #### 3. **解绑机制** 当需要移除事件时,`removeEventListener` 需要传入与之前绑定完全相同的回调函数实例才能成功解除绑定。对于匿名函数来说这是可能实现的,因此推荐总是保存引用以便稍后删除。 而对于 `onresize` ,由于它本质上是一个简单的属性指派操作,所以只需重新将其设为空即可清除之前的任何关联逻辑[^4]。 #### 4. **性能考量** 虽然两者都能响应窗口大小变化的通知,但从维护性和扩展性的角度来看,在现代开发实践中更倾向于采用基于标准 DOM API 的 addEventListener 方法。 ```javascript // 使用 onresize 方式 function handleResizeOn() { console.log("Resized via onresize"); } window.onresize = handleResizeOn; // 使用 addEventListener 方式 const handleResizeAddEvt = () => { console.log("Resized via addEventListener"); }; window.addEventListener('resize', handleResizeAddEvt); // 移除特定事件 (仅适用于 addEventListener) window.removeEventListener('resize', handleResizeAddEvt); ``` 综上所述,尽管两种技术都可以用来侦听调整浏览器尺寸的行为,但在实际项目里建议优先考虑后者以获得更好的兼容性以及管理能力[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值