要回答您的直接问题,您没有做错任何事情。JS 正在做它应该做的事情。
trld触发了 2 个事件,但只有一个包含匹配的媒体查询。
发生的情况是,当浏览器遇到断点时,会记录 2 个事件。例如,让我们考虑浏览器从 1250px 调整到 1150px 的情况。当窗口的宽度达到 1199px 时,您的函数:
Object.keys(config.mediaQueries).map((key) =>{
config.mediaQueries[key].addListener(function(event){
console.log("breakpoint change");
});
});
将记录 2 个事件。如果您深入研究并记录事件:
Object.keys(config.mediaQueries).map((key) =>{
config.mediaQueries[key].addListener(function(event){
console.log(event);
});
});
您将看到有关媒体查询的更多信息。我已经将事件对象归结为下面的重要道具。
// First event
matches: true
media: "(max-width: 1199px) and (min-width: 992px)"
// Second event
matches: false
media: "(min-width: 1200px)"
这里发生的是 2 个事件被记录,但只有一个事件包含匹配的查询。
因此,如果我们想改进您的日志记录脚本,您可以检查该matches
属性:
Object.keys(config.mediaQueries).map((key) =>{
config.mediaQueries[key].addListener(function(event){
if (event.matches) {
console.log(event);
}
});
});
通过这个小改动,只会记录匹配的媒体查询。