在 Internet Explorer 中触发 window.resize 事件

IT技术 javascript jquery internet-explorer resize jquery-events
2021-01-16 15:13:16

如您所知,在 Internet Explorer 中,当页面上的任何元素调整大小时都会触发 window.resize 事件。页面元素是否通过分配/更改其高度或样式属性、通过简单地向其添加子元素或其他任何方式来调整大小都无关紧要——即使元素调整大小不会影响视口本身的尺寸。

在我的应用程序中,这会导致令人讨厌的递归,因为在我的 window.resize 处理程序中,我正在调整一些 <li> 元素的大小,这又会重新触发 window.resize 等。同样,这只是 IE 中的一个问题。

有什么方法可以防止 window.resize 在响应页面上的元素被调整大小时在 IE 中触发?

我还应该提到我正在使用 jQuery。

6个回答

我刚刚发现了另一个可能对你有帮助的问题。

我正在使用 jQuery 并且我有 window.resize 事件来调用一个函数,该函数将重新定位附加到正文的 div。

现在,当我设置该附加 div 的 LEFT css 属性时,window.resize 事件会因为没有好的原因而触发。

它导致无限循环,一次又一次地触发 window.resize。

没有修复的代码:

$(window).resize(function(){
    var onResize = function(){
        //The method which alter some css properties triggers 
        //window.resize again and it ends in an infinite loop
        someMethod();
    }
    window.clearTimeout(resizeTimeout);
    resizeTimeout = window.setTimeout(onResize, 10);
});

解决方案:

var winWidth = $(window).width(),
    winHeight = $(window).height();

$(window).resize(function(){
    var onResize = function(){
        //The method which alter some css properties triggers 
        //window.resize again and it ends in an infinite loop
        someMethod();
    }

    //New height and width
    var winNewWidth = $(window).width(),
        winNewHeight = $(window).height();

    // compare the new height and width with old one
    if(winWidth!=winNewWidth || winHeight!=winNewHeight){
        window.clearTimeout(resizeTimeout);
        resizeTimeout = window.setTimeout(onResize, 10);
    }
    //Update the width and height
    winWidth = winNewWidth;
    winHeight = winNewHeight;
});

所以基本上它会检查高度或宽度是否改变(这只会在你实际调整窗口大小时发生)。

感谢您检查并查看窗口的宽度/高度是否已更改以查看实际窗口是否调整大小的想法!
2021-03-18 15:13:16
很好的解决方案 - 具有与此修复程序相同的无限循环情况。
2021-03-21 15:13:16
虽然检查宽度或高度是否发生变化仍然是一个好主意,但这并不能解决resize即使宽度和高度保持不变也持续触发处理程序的情况在我的情况下,它是document导致处理程序触发并导致无限循环的对象。
2021-04-03 15:13:16
Aamir,看起来就是这样。让我试试,我会回来告诉你它是如何工作的。
2021-04-05 15:13:16
onResize 是故意全局设置的还是您忘记了 var?
2021-04-14 15:13:16

这对我来说很有意义,并且似乎适用于 IE7 及更高版本:

    //variables to confirm window height and width
    var lastWindowHeight = $(window).height();
    var lastWindowWidth = $(window).width();

    $(window).resize(function() {

        //confirm window was actually resized
        if($(window).height()!=lastWindowHeight || $(window).width()!=lastWindowWidth){

            //set this windows size
            lastWindowHeight = $(window).height();
            lastWindowWidth = $(window).width();

            //call my function
            myfunction();


        }
    });

绑定您的调整大小侦听器,.one()以便它在触发后解除绑定。然后你可以做任何你想做的事情,只要最后你重新绑定调整大小的监听器。我发现最简单的方法是将调整大小的侦听器放在一个匿名函数中,如下所示:

var resizeListener = function(){
  $(window).one("resize",function(){ //unbinds itself every time it fires

    //resize things

    setTimeout(resizeListener,100); //rebinds itself after 100ms
  });
}
resizeListener();

从技术上讲,您不需要将其setTimeout包裹起来,resizeListener()但我将它放在那里作为以防万一和一些额外的节流。

很棒的方法,不使用任何额外的变量或 if 语句
2021-03-21 15:13:16
优秀的解决方案。请记住,函数在 JavaScript 中成熟的对象,因此resizeListener可以直接传递给setTimeout()而不是使用字符串文字"resizeListener();"
2021-03-28 15:13:16
感谢您的提示,@ user113215。我根据您的建议更新了代码。
2021-04-01 15:13:16
@brentonstrine 这解决了我$(window).resize()挂在 IE8 上的问题奇迹般有效。谢谢!
2021-04-10 15:13:16

我通过取消绑定调整大小函数,重建页面,然后再次绑定调整大小函数来解决它:

function rebuild() {
   $(window).unbind('resize');
   /* do stuff here */
   $(window).bind('resize',rebuild);
}

$(window).bind('resize',rebuild);

编辑

绑定和解除绑定不适用于 IE8。尽管 Microsoft 甚至放弃了 IE8,但您可能想尝试一下(未经测试!):

function rebuild(){
   if(!window.resizing) return false;
   window.resizing=true;
   /* do stuff here */
   window.resizing=false;
}

window.resizing=false;
document.body.onresize=rebuild;
解决方法可能是在调整大小之前检查的函数重建开始时设置一个全局参数: function rebuild(){ if(window.resizing) return false; window.resizing=true; /* 在这里做一些事情 */ window.resizing=false;); => 编辑答案以提高可读性
2021-03-21 15:13:16
是的,jQuery 绑定和解除绑定与 IE8 不兼容。我怀疑他们 (jQuery) 会修复它,因为自 2014 年 4 月 8 日起,即使 Microsoft 不再支持 IE8/XP...
2021-03-31 15:13:16
这似乎是最优雅的解决方案,但不幸的是,它似乎并不适合我。我正在 Windows XP 上的 IE 8 和 OS X 10.9 上的 Chrome 36 中进行测试。
2021-04-04 15:13:16

@AamirAfridi.com 的回答解决了我的问题。

编写一个通用函数来解决此类问题是个好主意:

function onWindowResize(callback) {
    var width = $(window).width(),
        height = $(window).height();

    $(window).resize(function() {
        var newWidth = $(window).width(),
            newHeight = $(window).height();

        if (newWidth !== width || newHeight !== height) {
            width = newWidth;
            height = newHeight;
            callback();
        }
    });
}

像这样使用它,您就不必再担心 IE 中的不同行为了:

onWindowResize(function() {
    // do something
});
最好使用 setTimeout 检查使用回调,以确保用户已完成调整窗口大小
2021-03-22 15:13:16