【问题标题】:Why does onresize fire when it shouldn't at low zoom levels in IE8?为什么 onresize 在 IE8 中不应该在低缩放级别时触发?
【发布时间】:2013-05-29 10:01:14
【问题描述】:

我写了一些 jquery 来调整元素大小并在调整浏览器窗口大小时关闭页面上所有打开的弹出窗口:

    addEvent({
        target: window,
        eventListener: 'onresize',
        func: function (e) {
            resizeElements(); //This resizes loads of stuff
            closeAllPopups(); //Closes any open popups
        }
    });

这适用于 100% 缩放。但是,在缩放级别小于 90% 时,onresize 会不断被调用,即使窗口没有调整大小。效果是弹出窗口不会打开 - 它们会立即关闭。

这似乎只发生在 IE8 上。它适用于 Chrome。

任何想法为什么会发生这种情况 - 它只是一个 IE8 错误吗?任何人都可以提出修复或解决方法吗?

【问题讨论】:

  • 调用resizeElements()时,是不是重新触发了窗口resize事件? (如果元素具有静态或相对位置)为什么只在 IE8 上?我不知道。
  • 不,它不会重新触发它,可能是因为 resizeElements 不会调整每个元素的大小,只是调整其中的一部分。

标签: javascript jquery internet-explorer-8 zooming onresize


【解决方案1】:

如何检查窗口原始大小和重新调整大小,然后尝试调用您的函数?

所以,即使您在加载时处于 90% 的视图中,此窗口大小也会是原始大小,并且只有在您调整大小(低于 90% 的视图)时,您的函数才会被调用?

$(document).ready(function(){
    var original_width = $(window).width();
    var original_height = $(window).height();

    $(window).resize(function() {
        var resize_width = $(window).width();
        var resize_height = $(window).height();

        if(original_width != resize_width && original_height != resize_height){
            alert('You resized!');
            // resizeElements(); //This resizes loads of stuff
            // closeAllPopups(); //Closes any open popups
        }
    });
}); 

【讨论】:

  • 简单得可笑。但是完美!谢谢 - 这对我很有用。
【解决方案2】:

您可以尝试使用计时器对其进行去抖动:

addEvent({
        target: window,
        eventListener: 'onresize',
        func: function (e) {
            clearTimeout(window.resizeTimeout);
            window.resizeTimeout = setTimeout(function(){
                resizeElements(); //This resizes loads of stuff
                closeAllPopups(); //Closes any open popups
            },50);
        }
    });

我在这里使用全局对象窗口来设置 resizeTimeout 变量,但最好使用局部变量。

【讨论】:

  • 对不起。去抖动在这里没有用。问题是onresize 被调用。即使没有调整窗口大小,它也会被调用。 (我会澄清我在问题中的措辞)
【解决方案3】:

没有办法“修复”浏览器本身的这个错误,所以你只需要解决一个不断触发的调整大小事件。所以烤是正确的使用时间,但你不是在寻找一个计时器。您需要存储时间,然后确保在再次触发事件之前已经过了足够的时间,如下所示:

var _interval = 1000;// milliseconds
var _resize = 0;
addEvent({
    target: window,
    eventListener: 'onresize',
    func: function (e) {
        if (Date.now() - _resize < _interval)
            return;
        _resize = Date.now();
        resizeElements(); //This resizes loads of stuff
        closeAllPopups(); //Closes any open popups
    }
});

【讨论】:

  • 一个解决方法就可以了。但我认为这个答案不会奏效。我仍然希望在调整窗口大小时触发 onresize 事件。此方法会在它触发一次后停止它再次触发。
  • 不,它没有。此示例防止事件每秒触发一次以上。再看一下代码。也许你应该在说它不起作用之前先尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多