75

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

在我的应用程序,这是造成讨厌的递归,因为在我的window.resize处理程序,我调整了一些<李>元素,这反过来又重新火window.resize,等等。再一次,这只是一个问题在IE中。

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

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

+2

有趣的,我不知道。我不熟悉JQuery,但如果它的源元素不是窗口本身,应该可以停止事件。我确信有人会想出一个编码解决方案。 – 2009-12-05 17:09:08

+0

这是什么版本的IE浏览器,你可以提供一些代码,实际显示调整大小的元素激发window.resize? – DEfusion 2009-12-08 13:30:29

+0

不应该关于其他版本,但它发生在IE 8 – Cocowalla 2013-01-22 18:48:28

回答

-1

当调整元素大小时,我无法获取调整大小事件(仅在IE8中尝试过)。

然而什么是事件对象的target当你遇到这个问题,你可以这样做:

$(window).resize(function(e) { 
    if(e.target != window) return; 
    // your stuff here 
}); 
+2

这不起作用,因为当元素触发window.resize时,window.resize上的目标始终是窗口。这就是为什么我开始怀疑它实际上无法完成... – MissingLinq 2009-12-07 16:02:21

58

我刚刚发现了另一个问题,这可能会帮助你。

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

现在,当我设置该附加div的LEFT css属性时,window.resize事件获取触发器为NO GOOD REASON。

它导致无限循环,一次又一次触发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; 
}); 

所以基本上如果高度或宽度改变,它会检查(当你真正用窗口调整这只会发生)。

+0

Aamir,看起来像这样做的伎俩。让我试试看,我会回来让你知道它是如何工作的。 – MissingLinq 2009-12-21 20:09:19

+1

感谢您检查并查看窗口的宽度/高度是否已更改,以查看实际窗口是否调整大小的想法! – 2010-04-28 20:32:29

+0

目的是onResize全局还是你忘记了var? – 2011-06-14 18:34:13

1

我今天就遇到了这个问题,并决定把我的世界的顶部下面包含的JavaScript文件:

var savedHeight = 0; 
var savedWidth = 0; 
Event.observe(window, 'resize', function (e) { 
    if (window.innerHeight == savedHeight && 
     window.innerWidth == savedWidth) { e.stop(); } 
    savedHeight = window.innerHeight; 
    savedWidth = window.innerWidth; 
}); 

这需要原型,顺便说一句。

-1

我的补丁:

<!--[if lte IE 7]> 
<script type="text/javascript"> 
    window.onresize = null;  // patch to prevent infinite loop in IE6 and IE7 
</script> 
<![endif]--> 
+0

我绝不会推荐像这样混淆windows对象。 – 2011-08-01 15:58:48

5

我解决它通过解除绑定的调整大小功能,重建页面,然后再结合大小调整功能:

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

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

编辑

绑定和取消绑定唐不适合IE8。虽然微软甚至放弃了IE8,但你可能想试试这个(未经测试!):

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

window.resizing=false; 
document.body.onresize=rebuild; 
+0

这似乎是最优雅的解决方案,但不幸的是,似乎并不适合我。我正在使用Windows XP上的IE 8和OS X 10.9上的Chrome 36进行测试。 – Sina 2014-08-02 20:14:33

+0

是的,jQuery绑定和解除绑定不能很好地与IE8一起使用。我怀疑他们(jQuery)会修复它,因为即使微软自2014年4月8日起不再支持IE8/XP ... – patrick 2014-08-03 10:12:47

+1

解决方法是在重新调整大小之前检查函数重建的开始时设置全局参数: function rebuild(){ if(window.resizing)return false; window.resizing = true; /*在这里做东西*/ window.resizing = false;); =>编辑回答为可读性 – patrick 2014-08-03 10:16:09

25

这对我有意义,似乎在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(); 


     } 
    }); 
-3
$(window).resize(function(event) 
{ 
    if (typeof event.target.tagName == 'undefined') 
    { 
     // ... 
    } 
}); 
+0

这没有工作 – mkoryak 2012-09-17 19:16:11

+0

这个答案怎么增加/改善其他高度评价答案?只有代码的答案不好。提供解释。 – 2012-10-26 14:00:02

1

unbind/bind方法有延迟呼叫组合。 它工作在Internet Explorer 8和下面,防止恶循环,并挂在版本6和7

function resizeViewport() 
{ 
    // Unbind and rebind only for IE < 9 
    var isOldIE = document.all && !document.getElementsByClassName; 

    if(isOldIE) 
     $(window).unbind('resize', resizeViewport); 

    // ... 

    if(isOldIE) 
    { 
     setTimeout(function(){ 
      $(window).resize(resizeViewport); 
     }, 100); 
    } 
} 

$(window).resize(resizeViewport); 
18

绑定你的听众调整大小与.one()使其烧成后解除绑定本身。然后你可以做任何你想做的事情,只要最后你重新调整调整大小的听众。我发现这样做最简单的方法是通过将调整大小监听器在一个匿名函数,像这样:

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

    //resize things 

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

在技术上不需要setTimeoutresizeListener()缠但我把它扔在那里作为只是在大小写和一些额外的限制。

+3

优秀的解决方案。请记住,函数*是JavaScript中的完整对象,因此'resizeListener'可以直接传递给'setTimeout()'而不是使用字符串''resizeListener();''。 – user113215 2013-03-14 20:06:23

+0

感谢您的提示,@ user113215。我根据您的建议更新了代码。 – brentonstrine 2013-06-25 18:31:22

+0

没有使用任何额外的变量或如果语句的真棒方法 – Ergec 2013-07-03 16:34:58

4

@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 
}); 
+1

更好地检查setTimeout的使用回调,以确保用户已完成窗口大小的调整 – 2014-03-03 10:20:37

-2

这取决于调整大小事件的内容。

只有当页面包含静态内容而不是动态呈现的页面时,我才想出了上述解决方案。 在动态情况下,现有内容将通过内容重载功能等某些触发事件重新呈现,我们需要使用$(document).width()或$(document).height()。

这是因为窗口的滚动条。 如果页面上有滚动条,并且主要内容将通过单击“重新加载”按钮来重新呈现,则滚动条会在事件中消失。 在这种情况下,$(window).width()或$(window).height()由内容渲染改变,而不是由实际的窗口大小调整。

http://www.tech-step.net/?p=466

1

你可以试试这个:

构造:

this.clientWidth = null; 
this.clientHeight = null; 

一些功能:

var clientWidth = window.innerWidth || document.documentElement.clientWidth; 
var clientHeight = window.innerHeight || document.documentElement.clientHeight; 
if (clientWidth != this.clientWidth || clientHeight != this.clientHeight) { 
    this.clientWidth = clientWidth; 
    this.clientHeight = clientHeight; 

    ... YOUR CODE ... 
} 

对于互联网浏览R,Chrome浏览器,火狐,Opera和Safari:

window.innerHeight - the inner height of the browser window 
window.innerWidth - the inner width of the browser window 

对于Internet Explorer 8,7,6,5:

document.documentElement.clientHeight 
document.documentElement.clientWidth 
    or 
document.body.clientHeight 
document.body.clientWidth 
0
(function ($){ 
    //if ie8 -> return; 
    var lastHeight = 0; 
    var lastWidth = 0; 
    $(window).resize(function(event){ 
     if (window.innerHeight == lastHeight && window.innerWidth == lastWidth) 
      { event.stopImmediatePropagation(); } 
     lastHeight = window.innerHeight; 
     lastHeight = window.innerWidth; 
    }); 
})(); 

的伎俩我...

0
<pre> 



var cont = 0; 
var tmRsize = 100; 
var lastWindowWidth = $(window).width(); 
var lastWindowHeight = $(window).height(); 

/*****redimensionamiento**********/ 
$(window).resize(function() 
{ 
    if($(window).width() != lastWindowWidth || $(window).height() != lastWindowHeight) 
    { 
     clearTimeout(this.id); 
     this.tiempo = tmRsize; 
     this.id = setTimeout(doResize, this.tiempo); 
    } 
}); 

function doResize() 
{ 
    lastWindowWidth = $(window).width(); 
    lastWindowHeight = $(window).height(); 

    $('#destino_1').html(cont++); 
} 

0

下面是我如何处理调查大小事件是如何处理通过元素触发或通过真正调整窗口大小:

如果事件的target.nodeType不存在,那么它很可能是窗口,因为页面上的任何其他元素都具有nodeType。

所以这里的(使用jQuery)伪代码的附加检查:

$(window).resize(function(event){ 
    if ($(event.target.nodeType).length == 0){ 
     // Anything here is run when the window was resized 
     // not executed when an element triggered the resize 
    } 
}); 
相关问题