2010-06-07 68 views
1

這裏是我的代碼,做工作:通過綁定jQuery中傳遞變量似乎並沒有工作

function mouseOver() 
{ 
    $(".beaver").fadeIn(100); 

} 

function mouseOut() 
{ 
    $(".beaver").fadeOut(100); 
} 

$("#group_beaver").bind('mouseenter', mouseOver).bind('mouseleave', mouseOut); 

但是,爲什麼不工作的呢?

function mouseOver(variable) 
{ 
    $(variable).fadeIn(100); 

} 

function mouseOut(variable) 
{ 
    $(variable).fadeOut(100); 
} 

$("#group_beaver").bind('mouseenter', mouseOver('.beaver')).bind('mouseleave', mouseOut('.beaver')); 
+0

加拿大代碼? – 2010-06-07 00:35:17

+0

我是加拿大人,但並不是那種海狸。 – dallen 2010-06-07 00:47:49

回答

6

這是正確的;你打電話mouseOver,並期待它返回一個綁定到事件的函數。爲了使它實際上做到這一點,雖然,您可以使用此代碼:

function mouseOver(variable) { 
    return function() { 
     $(variable).fadeIn(100); 
    }; 
} 
function mouseOut(variable) { 
    return function() { 
     $(variable).fadeOut(100); 
    }; 
} 
+0

+1個很好的例子。 – nickf 2010-06-07 00:25:08

+0

太棒了。你爲我節省了很多時間。謝謝! – dallen 2010-06-07 00:25:51

+0

如果這回答了你的問題,請標記爲通過點擊答案側面的小檢查答案。 – icktoofay 2010-06-07 00:33:38

1

icktoofay的技術稱爲閉包。關於關閉here有一個令人難以忍受的全面討論。我發現它們對使用window.setTimeout()安排事件非常有用。他們基本上允許你加載一個帶有先決條件的函數對象,然後用沒有參數的方式來評估它。相當漂亮。

但是他們所有的新奇倒閉通常是可以避免的。例如,如果.beaver的是#group_beaver孩子你會更好的東西去像

function mouseOver() 
{ 
    $(this).children().fadeIn(100); 
} 

在事件處理程序的jQuery可以確保this總是指觸發事件的元素,所以你已經基本上得到了免費的論據。鑑於你的例子簡單,我猜測閉包是沒有必要的。

你也可以這樣做:

$('group_beaver').mouseenter(function() { 
    $(variable).fadeIn(100); 
}); 

這實際上只是一種變相的關閉。它與下面的寫法:

function mouseOver(variable) { 
    return function() { 
     $(variable).fadeIn(100); 
    } 
}; 

$('#group_beaver').mouseenter(mouseOver('.beaver')); 
+0

這裏可能是錯的,但我認爲你錯了。如果你在一個循環內並調用它,那麼'variable'將始終是最後一個設置值。通過具有返回使用參數變量它會創建自己的上下文,並保留每個'variable'值,而不是最後一組值的函數的函數。我有道理嗎? :s – Brenden 2012-02-28 18:08:01

+0

嗯,你是對的。 'variable'將具有其值集合時'的mouseOver()'被調用,而不是當它存在時'mouseenter'火災使用從原始上下文的值。 – jasongetsdown 2012-03-06 16:45:54

+0

倒數第二個代碼塊仍然是正確的,雖然,恕我直言比icktoofay的更好;) – jasongetsdown 2012-03-06 16:49:50