关于resize事件,不同浏览器的触发行为

探讨 IE 浏览器标准模式下 window.onresize 事件的触发机制,尤其是在 BODY 元素尺寸变化时的情况,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准参考

Mozilla Developer Center 对 window.onresize 的描述如下,窗口 resize 事件的事件句柄。resize 事件在窗口大小变化时触发。并非规范的一部分。

MSDN 中 onresize 是一个许多对象均支持的事件,onresize 在对象的尺寸将要变化时被触发。IE 中 onresize 不仅可以应用于 window 对象,还可以应用于各种拥有布局(触发了hasLayout属性)的元素对象上。

关于 onresize 的详细信息,请参考 https://developer.mozilla.org/En/DOM/Window.onresize 或 http://msdn.microsoft.com/en-us/library/ms536959(VS.85).aspx

window.onresize 虽然不是 W3C 规范中的事件,但已被目前各主流浏览器所支持。

问题描述

IE 标准模式下 BODY 元素的高度发生变化时就会触发 window.onresize 事件。

造成的影响

在标准模式下,IE 对 onresize 事件的特殊支持可能导致作者由于动态改变了某个元素的尺寸而使 BODY 元素的尺寸也发生了变化,从而触发了 window.onresize 事件,但此时浏览器的窗口并没有改变大小。其他浏览器则不会触发 window.onresize 事件。

这种事件触发差异可能会造成兼容性问题。

受影响的浏览器

IE6(S) IE7(S) IE8(S) 

问题分析

分析以下代码:

<!DOCTYPE html>
<html style="border:5px solid blue;">
<head>
</head>
<body style="border:5px solid green;">
<div id="d" style="background:gray; height:30px;"></div>
<div id="e" style="background:lightgray;">Test line</div>
<script>
    var d = document.getElementById("d");
    var c = 0;
    setInterval(function () {
        c = parseInt(Math.random() * 100);
        d.style.height = c + "px";
    }, 1000);
    window.onresize = function () {
        d.innerHTML = d.style.height;
    }
</script>
</body>
</html>

测试代码中 BODY 元素下有两个 DIV 元素【d】和【e】,设置了一个定时器每隔 1 秒设置一次【d】的 height 特性,设置的值为 0—99px 的随机数。

window.onresize 事件触发时,将【d】的 height 特性的值显示在【d】的内容上。

将测试代码中的 HTML 与 BODY 元素的 height 特性设置为 3 组不同的情况与运行的结果列表如下
OK 代表 window.onresize 被触发,FAIL 代表没有被触发):

  IE6(Q) IE7(Q) IE8(Q) IE6(S) IE7(S) IE8(S) Firefox Chrome Safari Opera
HTML: height:auto
BODY: height:auto
FAIL OK FAIL
HTML: height:100%
BODY: height:auto
FAIL OK FAIL
HTML: height:100%
BODY: height:100%
FAIL FAIL FAIL

在测试代码中,每隔 1 秒动态改变的是【d】的高度,从 window.onresize 事件触发条件上看应该与【d】的高度的改变没有关系,然而在 IE 标准模式中,【d】的高度的变化却触发了 window.onresize 事件。修改上述测试代码,对【d】的宽度每秒进行一次设置,结果显示在 IE6(S) 中【d】的宽度变化也会触发window.onresize 事件。

IE6(Q) IE7(Q) IE8(Q) 中,根元素为 BODY,且 BODY 元素高度始终为 100%。无论【d】如何改变高度,均不会影响 BODY 元素的高度,所以 window.onresize 没有被触发。

为 HTML 与 BODY 元素均设置为 height:100% 后,IE 标准模式下,这时【d】的高度的改变也不会影响到 BODY 元素高度的改变。所以 window.onresize 也没有被触发。而当 BODY 元素的高度不是100%,由于 BODY 子元素的高度变化导致了 BODY 自身高度的变化,IE 标准模式下就会触发 window.onresize,虽然这时浏览器的窗口的大小并没有发生变化。

解决方案

1. 不期望触发 window.onresize 事件时:

为 HTML 与 BODY 元素设置 height:100% 和 width:100% 以防止因为其尺寸变化而触发 window.onresize 事件,如上表中第三行。

2. 期望触发 window.onresize 事件时:

在非 IE 浏览器中,主动去触发一次 window.onresize 事件,代码如下:

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("resize", true, true, this, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
window.dispatchEvent(evt);
ndow.onresize 事件
`cursor:col-resize` 是 CSS 中的一个样式属性,它通常用于表示鼠标悬停在一个列上时变成双向箭头,表示可以调整列宽。当用户开始调整列宽度并释放鼠标时,浏览器默认的行为可能是继续响应后续点击事件,比如切换元素状态或者激活某个链接。 如果你想在用户完成列宽调整后阻止其他的点击事件,你需要通过JavaScript来实现这一功能。一种常见的做法是在列调整期间设置一个标记(如`dragging`状态),并在该状态下监听鼠标释放事件。当检测到鼠标释放并且`dragging`状态取消时,你可以清除所有其他事件处理器或者设置一个阻止默认行为的标志: ```javascript // 假设有一个元素有 colResize 类 document.querySelectorAll('.col-resize').forEach(element => { element.addEventListener('mousedown', startDrag); element.addEventListener('mouseup', endDrag); }); function startDrag(event) { // 设置 dragging 状态 element.classList.add('dragging'); event.preventDefault(); // 阻止默认行为 } function endDrag(event) { if (element.classList.contains('dragging')) { // 如果仍在拖动 element.classList.remove('dragging'); // 清除状态 // 移除或禁用后续的 click 或者其他事件处理器 element.removeEventListener('click', handleClick); } } ``` 在这个例子中,`handleClick` 是一个假设的点击事件处理函数,它会被移除直到列调整结束。当你需要再次启用这些事件时,可以再添加回去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值