2015-02-10 112 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