gpt4 book ai didi

javascript - matchMedia 调用函数两次

转载 作者:行者123 更新时间:2023-11-28 00:36:27 25 4
gpt4 key购买 nike

我正在尝试在移动设备上使用一个函数(本例中小于 700px),并在大型设备上使用另一个函数。我按以下方式使用 matchMedia:

var mql = window.matchMedia("(min-width: 700px)");
mql.addListener(handleResize);
handleResize(mql);
function handleResize(mql) {
if (mql.matches) {
$(".button").on("click", function(){
$(".hidden").slideToggle();
})
} else {
$(".button").on("click", function(){
$(".hidden").fadeToggle();
})
}
}

首先,代码的行为符合预期,当我调整窗口大小时出现问题。例如,如果窗口首先加载到 700 像素以下,然后调整大小到超过 700 像素,则按钮首先触发淡入淡出,然后滑动,反之亦然。当然,我想要实现的目标是仅在大屏幕上调用幻灯片,而仅在小屏幕上调用淡入淡出。非常感谢任何帮助。

干杯!

最佳答案

问题在于,每次触发 handleResize 回调时,它都会向按钮附加另一个 click 事件。为了防止附加大量事件,您必须首先使用 off() 将其删除。

这是一个实现您想要的示例:

var $hidden = $('.hidden');
var $btn = $('button');
var mql = window.matchMedia("(min-width: 700px)");

function bindSlide() {
// Using `off()` is required in order not to end up attaching a lot of callbacks
$btn.off("click.mql").on("click.mql", function() {
$hidden.stop().slideToggle();
});
}

function bindFade() {
$btn.off("click.mql").on("click.mql", function() {
$hidden.stop().fadeToggle();
});
}

function handleScreen(mql) {
if (mql.matches) {
bindSlide();
} else {
bindFade();
}
}

// Handle media query 'change' event
mql.addListener(handleScreen);
handleScreen(mql);

请注意,并非所有浏览器都支持 window.matchMedia。对于本身不支持 matchMedia 的浏览器,您可以使用 polyfill:https://github.com/paulirish/matchMedia.js

实例:http://jsfiddle.net/rhkLng9o

关于javascript - matchMedia 调用函数两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28441314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com