为什么在加载页面时会调用window.onresize?

Hap*_*976 9 javascript window-resize

一个JavaScript问题.

有人知道为什么在window.onresize页面加载时会在某些浏览器中调用它吗?

这可以避免吗?

我发现了IE中的问题,Android 27的Firefox 27(三星Galaxy S3上测试),Google Nexus 7(浏览Browserstack)和Windows Phone 8(Internet Explorer).

我的testpage看起来像这样:

    <!doctype html>

<html>

<head>

<meta charset="utf-8">

<title>Test</title>

    <script type="text/javascript">

    window.onresize = resize;

    function resize(){

    alert("resize event detected!");
    }

    </script>

</head>

<body>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

解:

var windowWidth = $(window).width();

window.onresize = resize;

function resize(){

   if($(window).width()!=windowWidth){

      alert("Bingo");
          windowWidth = $(window).width();
   }

}
Run Code Online (Sandbox Code Playgroud)

the*_*man 3

据我所知,在桌面浏览器上window.onresize默认情况下不会在页面加载时调用

我写了一个简单的html页面如下(很多H1s让页面有一些内容):

<!DOCTYPE html>
<html>
<head>        
    <script>
        var i = 0;
        window.onresize = function() {
            i++;
        }
        window.setTimeout(function() {
            alert("resize called " + i + " times");
        }, 2000);
    </script>
</head>
<body>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
    <h1>test</h1>
</body>
</html>    
Run Code Online (Sandbox Code Playgroud)

该警报在以下浏览器中显示 0:

  • 铬32
  • 火狐26
  • 歌剧 12
  • IE11
  • IE8
  • Safari 5.1.7

移动浏览器视口理论

我可以看到您的问题似乎出在移动设备上。onresize可能会在页面加载时触发,因为在移动浏览器加载内容并弄清楚如何将页面缩放到屏幕尺寸后,“视觉视口”会调整大小。

有关移动视口的说明,请参阅此处:

http://www.quirksmode.org/mobile/viewports2.html

请参阅此处的表格,了解几种移动浏览器如何处理onresize视觉视口的事件:

http://www.quirksmode.org/dom/events/resize_mobile.html

如果是这种情况,那么我认为你可能会很难与之抗争。


忽略第一个调用onresize

为了避免第一次运行事件处理程序,onresize您可以简单地设置一个标志,如下所示:

var initial = true;
$(window).on('resize',function(){
    if(!initial)
    {
        // do your stuff here
    }else
    { 
        // don't do your stuff here
    } 
    initial = false;
});
Run Code Online (Sandbox Code Playgroud)

onresize但是,正如您在评论中所说,如果按预期工作(并且不在页面加载时运行),这将不起作用。它假设第一次运行将在页面加载时进行。