window.devicePixelRatio更改侦听器

Mat*_*ady 8 javascript retina

window.devicePixelRatio将返回1或2,具体取决于我是否正在使用我的视网膜监视器或标准.如果我在两个监视器之间拖动窗口,则此属性将更改.有没有办法在变化发生时让听众开火?

nor*_*gon 12

你可以听一下媒体查询matchMedia,告诉你devicePixelRatio何时超过某个障碍(遗憾的是不是因为任意比例变化).

例如:

window.matchMedia('screen and (min-resolution: 2dppx)').
    addListener(function(e) {
      if (e.matches) {
        /* devicePixelRatio >= 2 */
      } else {
        /* devicePixelRatio < 2 */
      }
    });
Run Code Online (Sandbox Code Playgroud)

在监视器之间拖动窗口时,以及插入或拔出外部非视网膜监视器时(如果它导致窗口从视网膜移动到非视网膜屏幕,反之亦然),将调用监听器.

window.matchMediaIE10 +和所有其他现代浏览器都支持.

参考文献:https://code.google.com/p/chromium/issues/detail?id = 123694,MDN onmin-resolution


Flo*_*ier 11

互联网上的大多数(或全部?)答案只能检测到特定的变化。通常,它们会检测该值是 2 还是其他值。

问题可能在于 MediaQuery,因为它们只允许检查特定的硬编码值。

通过一些编程,可以动态创建媒体查询,该查询检查当前值的更改。

let remove = null;

const updatePixelRatio = () => {
  if(remove != null) {
      remove();
  }
  let mqString = `(resolution: ${window.devicePixelRatio}dppx)`;
  let media = matchMedia(mqString);
  media.addListener(updatePixelRatio);
  remove = function() {media.removeListener(updatePixelRatio)};

  console.log("devicePixelRatio: " + window.devicePixelRatio);
}
updatePixelRatio();
Run Code Online (Sandbox Code Playgroud)


EzP*_*zza 8

我采用了 IMO 的最佳答案(@Neil)并使其更易于阅读:

function listenOnDevicePixelRatio() {
  function onChange() {
    console.log("devicePixelRatio changed: " + window.devicePixelRatio);
    listenOnDevicePixelRatio();
  }
  matchMedia(
    `(resolution: ${window.devicePixelRatio}dppx)`
  ).addEventListener("change", onChange, { once: true });
}
listenOnDevicePixelRatio();
Run Code Online (Sandbox Code Playgroud)

不需要固定的边界或变量。

  • 此方法也符合 MDN 中的文档:https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#monitoring_screen_resolution_or_zoom_level_changes (3认同)

小智 6

感谢@florian-kirmaier,这正是我正在寻找的,如果您{once: true}在事件监听器中传递选项,则无需手动跟踪和删除事件监听器。

(function updatePixelRatio(){
matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)
.addEventListener('change', updatePixelRatio, {once: true});
console.log("devicePixelRatio: " + window.devicePixelRatio);
})();
Run Code Online (Sandbox Code Playgroud)