2015-02-10 83 views
1

我想在移动设备上使用一个函数(在这个例子中小于700px)和大型设备上的另一个函数。我用以下方式使用matchMedia: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像素以上,则该按钮会先消失,然后再放开,反之亦然。我想要实现的目标只是在大屏幕上调用幻灯片,并且只能在小屏幕上褪色。任何帮助是极大的赞赏。

干杯!

+0

使用你的代码中调整处理器... – 2015-02-10 20:46:13

+0

感谢您的回复,但你可以请你澄清你的意思? – easynowbaby 2015-02-10 21:10:35

回答

2

问题是,每当handleResize回调触发时,它将另一个点击事件添加到按钮。为防止发生大量事件,您必须先用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本身你可以使用填充工具的浏览器:https://github.com/paulirish/matchMedia.js

活生生的例子:http://jsfiddle.net/rhkLng9o

+0

非常感谢您的回答和您的时间!你介意解释一个细节吗? .off和.on中的“click.mql”是什么?这是一种自定义事件吗?当我删除“.mql”部分时,我注意到代码不起作用。谢谢!! – easynowbaby 2015-02-10 22:24:13

+0

这是jQuery的命名空间事件方式。这是一个很好的做法,因为当你删除一个像这样的事件时:$ btn.off('click')'它将删除该元素中的所有点击处理程序。但是,当你添加一个后缀如**。something **,并使用后缀'$ btn.off('click.something')'来移除该事件时,它将只删除那些处理程序,而不是全部处理程序。更多在这里:http://api.jquery.com/on/#event-names – istos 2015-02-10 22:51:28

+0

哦,我的,这太棒了!再次感谢! – easynowbaby 2015-02-10 23:27:03