2011-02-09 58 views
4

我正在使用選項卡式界面,並設置了以下jQuery函數來處理我的選項卡的單擊事件。將jQuery .click()函數作爲變量傳遞

$(document).ready(function() { 

    $('a#foo').click(function() { 
     //content, various calls 
     return false; 
    }); 
}); 

以上是我的一個選項卡的示例,其他人也在同一個文檔就緒區塊內。我需要做的是讓它當前選定的選項卡不能重新點擊,在其他一些情況下,我可以手動禁用選項卡,如果需要的話。我通過以下實現這一點:

$('a#play').unbind('click');  

這工作得很好,它肯定禁用標籤,但隨後問題就變得重新綁定的點擊動作,曾經在那裏。我通過綁定函數來實現這一點:

$('a#foo').bind('click', function() { 
//the same content and calls as before 
return false; 
}); 

這也能正常工作,但我已經添加標籤到我的UI已經變得非常混亂。直接的解決方案似乎是將該函數創建爲變量,然後將其傳遞給初始點擊創建和綁定事件。像這樣:

var Foo = new function() { 
    //same content and calls as before 
    return false; 
} 

$('a#foo').click(Foo()); 

$('a#foo').bind(Foo()); 

由於某種原因,這似乎是導致瀏覽器崩潰的問題。在這種情況下是不是可以傳遞一個函數作爲var,或者我只是做錯了嗎?或者,有沒有更好的方法來實現我期待的結果?謝謝。

回答

7
$('a#foo').click(Foo()); 

$('a#foo').bind(Foo()); 

Foo爲您提供的功能,但加入()的意思後你調用的功能,而不是通過函數本身。由於您正在調用該函數,因此false最終傳遞到clickbind,顯然沒有做任何事情。一些其他問題可能是由於您模擬切換到該選項卡兩次(調用兩次事件處理程序)所致。

var Foo = function() { 
    //same content and calls as before 
    return false; 
} 

$('a#foo').click(Foo); 

$('a#foo').bind(Foo); 

^^應該做你想做的。


或者,有沒有更好的方式來實現我在尋找的結果?

目前我們真正瞭解您的設計的一點是,您使用點擊事件處理程序來調用切換標籤。這部分很棒,但我們需要更多的信息來給你更深的答案,你真的想要。如果您在Foo裏面發佈代碼,我們應該能夠幫助更多。 :d


編輯:信貸SLaks♦在函數聲明,我錯過了在注意到new。我將添加更多的細節他的解釋:

當你寫變種富=新 功能(...){...},你正在做一個 功能的文字,然後調用它作爲 構造函數。

它相當於

var SomeClass = function(...){...}; var foo = new SomeClass;

沒有SomeClass虛擬變量。

function() {}是一個匿名函數,正如您所期望的那樣。在JavaScript中的new有點混亂。當您調用一個函數並在其前面加上new時,您正在使用該函數來實例化函數中定義的類的實例。在JS,與其他大多數語言中,一個類的全部定義在一個構造函數,從中你將所有的實例變量,就像這樣:

Foo = function() { 
    this.a = "lala"; 
    this.b = 5; 
} 

爲了使「類」的實例方法,你使用原型屬性。 但是我剛剛意識到我已經超脫了主題。詳細瞭解herehere。 :D

+0

哇,這整個主題已經超翔實/得心應手。我甚至從來沒有意識到JS功能是這樣工作的。非常感謝大家,感謝@CrazyJugglerDrummer把它放在一起,像魅力一樣工作! – keybored 2011-02-10 20:31:15

3

您需要從函數定義中刪除new,並在使用函數時停止調用該函數。

當您編寫var foo = new function(...) { ... }時,您正在創建函數文字,然後將其作爲構造函數調用。

這相當於

var SomeClass = function(...) { ... }; 
var foo = new SomeClass; 

沒有SomeClass虛擬變量。

您只需將函數文字分配給變量。


當你寫.click(foo()),你調用foo,並將結果傳遞給click
除非foo返回一個函數,這不是你想要做的。

您需要通過foo刪除括號。

3

因此,首先,點擊接受函數,但您在沒有()的時候調用點擊運行函數。通過添加()你直接調用它。

其次,綁定需要一個字符串(什麼事件要綁定到)和功能(如上)...

使用以下命令:

function Foo() { 
    //same content and calls as before 
    return false; 
} 


$('a#foo').click(Foo);  
$('a#foo').bind('click', Foo); 

希望幫助:)

3

嘗試:

var foo = function() // not "new function", as this creates an object! 
{ 
    return false; 
} 

$("a#foo").click(foo); // not "Foo()", as you can't call an object! 

至於更好的方式來實現你正在尋找的結果,你可以在每個標籤上有一個類,例如.tab。這樣一來,你可以做:

$("a.tab").click(function() { return false; }); 

...而不必絨毛用了很多id S爲中心。

2

採取不同的方法,也不要unbind()

我假設的標籤都在一個共同的容器中。如果是這樣,只需使用delegate()(docs)方法可以將處理程序在容器上。

這裏有一個通用的代碼示例:

$('#container').delegate('.tab:not(.selected)', 'click', function() { 
    $(this).addClass('selected') 
      .siblings('selected').removeClass('selected'); 
    // rest of the tab code 
}); 

這隻會觸發對不具備.selected.tab元素的點擊次數。您需要修改您的特定代碼。

0

添加括號調用函數,但是如果你想讓它涼的東西,你可以讓這個富返回要綁定的功能。

function Foo(){ 

    return function(){ 
     //your onclick event handler here. 
    }; 
} 

$('a#bar').bind(Foo()) 

這使得對JavaScript的功能規劃方面,封閉,這是酷使用一種,但效率不高,因爲一些其他的答案。你應該對閉包進行一些研究,因爲它們可以用來製作一些很酷的東西。 http://www.javascriptkit.com/javatutors/closures.shtml