首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用变异观测器检测dom元素样式的变化

使用变异观测器检测dom元素样式的变化
EN

Stack Overflow用户
提问于 2018-06-19 13:36:29
回答 1查看 3.1K关注 0票数 6

使用MutationObserver,我希望检测到由于组件中的媒体查询而导致的dom元素更改。

但是,当样式更改时,MutationObserver无法触发事件。

代码语言:javascript
复制
detectDivChanges() {
    const div = document.querySelector('.mydiv');
    const config = { attributes: true, childList: true, subtree: true };
    const observer = new MutationObserver((mutation) => {
      console.log("div style changed");
    })
    observer.observe(div, config);
  }
}
代码语言:javascript
复制
<div class="mydiv">test</div>
代码语言:javascript
复制
.mydiv {
  height: 40px;
  width: 50px;
  background-color: red;
}

@media screen and (min-width : 500px) {
  .mydiv {
    background-color: blue;
  }
}

下面是代码的活版

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 05:23:32

变异观察者可以观察到对DOM树所做的更改,

当您的CSS MediaQuery更改时,DOM树不会受到任何影响,因此MutationObserver不会捕获它。

您的困惑来自于HTMLElement_s确实具有style属性这一事实。这种态度确实是DOM树的一部分。但是这个style属性不是应用于元素的_style。这个属性确实声明了一个StyleSheet,如果需要的话,CSSOM将解析和使用它,但是CSSOM和DOM是两个独立的东西。

因此,您要检测的是CSSOM更改而不是DOM更改(当您调整屏幕大小时,style属性不会更改),而MutationObserver无法做到这一点。

但是,由于您愿意侦听CSS MediaQuery更改,所以可以使用MediaQueryList接口及其改换事件处理程序:

代码语言:javascript
复制
const mediaQuery = window.matchMedia('screen and (min-width : 500px)');
mediaQuery.onchange = e => {
  console.log('mediaQuery changed', 'matches:', mediaQuery.matches);
}
代码语言:javascript
复制
.mydiv {
  height: 40px;
  width: 50px;
  background-color: red;
}

@media screen and (min-width : 500px) {
  .mydiv {
    background-color: blue;
  }
}
代码语言:javascript
复制
<div class="mydiv">test</div>

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50929847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档