matchMedia()。addListener标记为已弃用,addEventListener是否等效?

Mat*_*ley 4 javascript addeventlistener matchmedia

我正在使用matchMedia()。addListener来检测Safari中的暗/亮模式主题首选项更改,但是在WebStorm中,使用addListener标记为已弃用,只是说要参考文档以替代它。

我已经通读了MDN文档,但我不明白我应该在addEventListener中侦听哪种事件类型来代替addListener?

window.matchMedia("(prefers-color-scheme: dark)").addListener(() => this.checkNative());
window.matchMedia("(prefers-color-scheme: light)").addListener(() => this.checkNative());
Run Code Online (Sandbox Code Playgroud)

Sza*_*aba 42

Chrome 和 Firefox 的处理方式与 Safari 不同,我通过以下方式解决了它:

const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');

  try {
    // Chrome & Firefox
    darkMediaQuery.addEventListener('change', (e) => {
      this.$vuetify.theme.dark = !this.$vuetify.theme.dark;
    });
  } catch (e1) {
    try {
      // Safari
      darkMediaQuery.addListener((e) => {
        this.$vuetify.theme.dark = !this.$vuetify.theme.dark;
      });
    } catch (e2) {
      console.error(e2);
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果您对如何通过您的网站支持深色模式感兴趣,请阅读此博文

  • 看起来 safari 从版本 14 开始支持 `addEventListener('change', ...` (参见 https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList/onchange)。当前版本是 15 ,因此于 2020 年 11 月 12 日通过。 (5认同)
  • @AnnKilzer 是的,那是因为 Safari 尚不支持新的 API,因此如果您想支持 Safari,则必须使用(已弃用的)“addListener”方法。 (2认同)

ran*_*oul 5

从文档-https: //developer.mozilla.org/zh-CN/docs/Web/API/MediaQueryList/addListener

表示您要在媒体查询状态更改时运行的回调函数的函数或函数引用。

应该是change事件。https://developer.mozilla.org/zh-CN/docs/Web/API/MediaQueryList/onchange

const mql = window.matchMedia("(prefers-color-scheme: dark)");

mql.addEventListener("change", () => {
    this.checkNative();
});
Run Code Online (Sandbox Code Playgroud)

  • TypeError: window.matchMedia("(prefers-color-scheme: dark)").addEventListener 不是函数。 (8认同)
  • 啊,看起来 Safari 尚不支持此功能,但 addListener 支持。多么奇怪... (6认同)
  • 运行 IOS 13.4.1 的 iPhone 6s 也存在类似问题 - 日志错误 addEventListener 不是函数。必须将代码恢复为已弃用的 addListener() 才能使 Angular Web 应用程序在 iPhone 上的 Safari 和 Chrome 上运行。有什么想法改变了吗? (3认同)
  • @MattCowley 一点也不奇怪。Safari 在遵守 W3C 标准方面表现不佳。 (2认同)

OZZ*_*ZIE 5

如果你只是按照 MDN 的方式进行操作,它可以跨浏览器运行(在支持的情况下):

const mql = window.matchMedia('(max-width: 767px)');
mql.onchange = (e) => { 
  /* ... */
}
Run Code Online (Sandbox Code Playgroud)

IE以上应该支持。例如所有 Edge + 现代浏览器。

https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList/onchange