移动端——orientationchange事件

2,230 阅读1分钟

今天再看项目中发现,在window的监听事件rezise、 orientationchange、DOMContentLoaded的回调函数中都使用了setTimeout来刷新rem的计算。看到之后,比较疑惑为什么都要加setTimeout来执行rem的计算,查询了相关资料发现,是兼容问题。就此问题做个记录。

具体理解为:

触发orientationchange事件回调函数时有兼容问题。具体表现在回调函数中获取windows.innerWidth与windows.innerHeight属性上的差异。

在safari下,对orientationchange支持很好,当orientationchange触发回调时,使用windows.innerWidth能或立刻获取到最新的屏幕高宽。

而在Android浏览器下,需要延迟一定的时间,才能获取到正确的屏幕高宽。如果触发回调函数时,立刻使用windows.innerWidth,那么,只能取到方向未改变之前的高宽,在Android下使用下面的一个简单试验可以得出结果:

<script type="text/javascript">
alert(window.innerWidth); // 默认竖屏状态,得到屏宽480px;
window.addEventListener('orientationchange', function() {
    alert(window.innerWidth); // 触发orientationchange回调时,得到屏宽还是480px;
    setTimeout(function() {
        alert(window.innerWidth); // 延迟300ms,才能得到正确屏宽960px
    }, 300);
}, false);
</script>

注意: 如果移动端把横竖屏切换锁掉的话,orientationchange事件不生效