【发布时间】:2019-04-15 06:51:04
【问题描述】:
我有一个 chrome 应用程序,我想在分辨率更改时正确调整大小(尺寸与屏幕宽度成正比)。我已经编写了一个函数,可以用正确的尺寸重绘应用程序,现在我只想在需要时执行它。
分辨率改变会导致 screen.width 改变,但是(可能并不奇怪,因为它们与不同的事物相关)“resize”事件没有被触发,而且据我所知没有任何事件被触发。
我知道代理对象 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy),所以我编写了一些代码来检测何时设置变量并执行我的回调,这似乎有效,但在分辨率更改的实例中无效。
所以我在网上搜索并尝试了这个https://gist.github.com/eligrey/384583(这基本上是关于类似主题的几个 stackoverflow 问题中提供的答案,并且确实是我最初制作的,尽管缺乏新的 Proxy 对象提供的抽象)。
这似乎也有效(从某种意义上说,如果我说在完成 screen.watch("width", () => console.log("hello")); 然后执行 screen.width 之后手动设置 screen.width。 width = 100;我的回调被执行)。但不是在分辨率更改的情况下(事实上,也许最重要的是,分配这个观察者似乎可以防止 screen.width 被分配)。
我有三个问题
1) 当我分配一个观察者/代理时会发生什么事情搞砸了。
2) 我怎样才能知道浏览器在这个细节级别上正在做什么(什么发送触发器来更改 screen.width?我猜是操作系统,这是什么样子的)
3) 有没有更好的方法来实现我最初的目标(Chrome 应用调整大小)。
我主要对问题 1) 感兴趣,不再关心 3)。
复制我的问题,
- 在 Firefox 或 chrome 中打开一个新标签
- 转到开发者控制台。
- 检查screen.width,改变分辨率,观察screen.width的变化
- 从https://gist.github.com/eligrey/384583复制并粘贴代码
- 执行 screen.watch("width", (id, oldval, newval) => {console.log("hello"); return newval;});
- 做screen.width = 100;并观察 hello 已记录并且 screen.width 设置为 100
- 更改分辨率,观察 screen.width 没有设置。
编辑 - 正如 Bertrand 的回答后所揭示的那样,resize 事件实际上可能会在分辨率更改时触发,但这似乎是对分辨率更改的响应,迫使窗口的边界变小,如果窗口很小,那么screen.width 可以在不触发调整大小事件的情况下更改。
【问题讨论】:
-
最简单的解决方案是设置一个计时器,然后每 10 秒检查一次
screen.width。 -
给windows resize 事件添加事件监听器不起作用?通常它在 chrome 中运行良好。
-
@georg 我已经考虑过这一点,但不满意作为解决方案(我需要非常快速的响应)。我不必再太在意 chrome 应用程序的原因是我有一个备用计划来满足我的需要,因为它肯定会奏效。
-
@Mark Baijens 是正确的,我对 window.addEventListener("resize", f) 很满意并且之前使用过它,但似乎分辨率更改与调整大小不同,我只是尝试过再次在 chrome 上,它没有工作。如果相关,我使用的是 Windows 10。
-
在 chrome 中有Resize Observer