Javascript 网络应用程序中的Android屏幕分辨率不是恒定的

Javascript 网络应用程序中的Android屏幕分辨率不是恒定的,javascript,android,screen-resolution,Javascript,Android,Screen Resolution,这很奇怪。我正在使用javascript计算网页中的分辨率。为此,我对以下函数进行了简化: function check() { var win = document.defaultView || document.parentWindow, ratio = win.devicePixelRatio ? win.devicePixelRatio : 1, h = win.innerHeight, w = win.innerWidth,

这很奇怪。我正在使用javascript计算网页中的分辨率。为此,我对以下函数进行了简化:

function check() {
    var win = document.defaultView || document.parentWindow,
        ratio = win.devicePixelRatio ? win.devicePixelRatio : 1,
        h = win.innerHeight,
        w = win.innerWidth,
        root = document.documentElement;

    if (!h) {
        h = root.clientHeight;
        w = root.clientWidth;
    }
    alert("height/width/ratio; " + h + "/" + w + "/" + ratio);
}

在android设备上,似乎有一种非常奇特的行为:

我将以Nexus S为例,但显然我已经在运行不同版本的许多其他Android设备上验证了这一点

如果您通过单击电子邮件应用程序gmail或outlook中的链接到达包含上述脚本的页面,则警报将生成1130/800/1.5高度和宽度太高。这是一致的。现在,如果您转到地址栏,编辑url添加/删除一个参数或参数值,然后点击go,完全相同的代码将生成452/320/1.5,这更像它,这也是一致的

这究竟是怎么发生的,为什么发生的


编辑:值得注意的是,到目前为止,这似乎只适用于devicePixelRatio>1的设备,即v1.5/1.6上的旧Android手机。经过大量搜索和调试,这几乎像是一个bug

复制很容易:如果上面的脚本在onload事件中同步运行,并且您单击打开新窗口、电子邮件应用程序或目标为空的网页的内容,那么屏幕和窗口的宽度和高度属性都将错误。如果您使用jQuery、YUI或纯javascript,则没有区别

解决方案/解决方法是将onload中调用的方法包装到setTimeout中,并将timeout设置为0。这将异步运行该方法并产生正确的结果

<body onload="setTimeout(check, 0);">

朋友们,这就结束了这个案例。

浏览器缩放是否会影响它?我无法想象,不会。这两种情况下的页面看起来都一样,您唯一要做的就是更改url并重新加载,而不是使用缩放。我看不出在这段时间内,变焦会自动改变。