如您所知,在Internet中,当页面上的任何元素都被调整大小时,就会触发 window.resize事件。通过给页面元素分配/更改其高度或样式属性来调整页面元素的大小,通过简单地向其添加一个子元素,或者其他什么--即使元素调整大小不影响视口本身的尺寸--并不重要。
在我的应用程序中,这导致了一个令人讨厌的递归,因为在我的window.resize处理程序中,我正在调整一些元素的大小,这反过来又会重新触发window.resize等等,这只是IE中的一个问题。
有什么方法可以防止在IE中触发window.resize以响应页面上的元素被调整大小?
我还应该提到,我正在使用jQuery。
发布于 2009-12-17 11:55:41
我刚刚发现了另一个可能对你有帮助的问题。
我使用jQuery,我有window.resize事件来调用一个函数,这个函数将重新定位附加到身体上的div。
现在,当我设置附加的div的左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;
});因此,基本上,它将检查是否改变了高度或宽度(只有当您实际调整窗口大小时才会发生这种情况)。
发布于 2012-01-08 11:21:17
这对我来说很有意义,似乎适用于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();
        }
    });发布于 2012-11-08 21:21:07
将您的调整大小侦听器绑定到.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()上,但是我把它作为一个普通的案例和一些额外的节流器扔进去。
https://stackoverflow.com/questions/1852751
复制相似问题