2009-02-06 76 views
71

我已經使用jQuery創建了一個'控件',並使用jQuery.extend來協助使其成爲儘可能的OO。在jQuery事件中控制'this'的值

在我控制我線了,像這樣

jQuery('#available input', 
      this.controlDiv).bind('click', this, this.availableCategoryClick); 

請注意,我考取各種click事件初始化「這個」作爲綁定方法的數據參數。我這樣做是爲了讓我可以將數據附加到控件實例,而不是觸發click事件的元素。

這完美的作品,但我懷疑有已經使用原型在過去更好的方式

,我記得讓你控制什麼價值「這個」是在事件綁定語法。

什麼是jQuery的方式?

+0

不知道爲什麼你試圖製作jQuery OO,因爲jQuery比OO更具功能。 – cletus 2009-02-06 11:51:06

回答

98

您可以使用jQuery.proxy()與匿名函數,只是有點尷尬的是「語境」是第二個參數。

$("#button").click($.proxy(function() { 
    //use original 'this' 
},this)); 
20

我不認爲jQuery有一個內置的功能。但是你可以使用一個輔助構建類似如下:

Function.prototype.createDelegate = function(scope) { 
    var fn = this; 
    return function() { 
     // Forward to the original function using 'scope' as 'this'. 
     return fn.apply(scope, arguments); 
    } 
} 

// Then: 
$(...).bind(..., obj.method.createDelegate(obj)); 

這種方式,你可以創建動態的「包裝功能」與createDelegate方法()調用與給定對象作爲其「本」範圍的方法。

實施例:

function foo() { 
    alert(this); 
} 

var myfoo = foo.createDelegate("foobar"); 
myfoo(); // calls foo() with this = "foobar" 
+39

夥計們,這篇文章是2009年2月寫的,目前還沒有`jQuery.proxy()`(v.1.4,2010年1月出現)。沒有必要downvote。 – 2011-11-22 15:36:18

+5

是不是要給最好的答案最多的票?我讚賞過時的答案是否被反對或否決。它有助於避免誤導恕我直言。 – ben 2014-05-30 20:56:54

+1

當然,最好的答案應該得到最多的選票,因爲它是這裏的情況。但這並不意味着次優答案應該被低估。這會降低聲譽,並且不公平。你期望我做什麼?定期檢查並修改我的古代答案? – 2014-05-31 06:47:05

2

jQuery的不支持綁定,優選的方法是使用功能。

因爲在JavaScript中,this.availableCategoryClick並不意味着調用這個對象上availableCategoryClick功能,jQuery的建議使用該優選語法:

var self = this; 
jQuery('#available input', self.controlDiv).bind('click', function(event) 
{ 
    self.availableCategoryClick(event); 
}); 

在Javascript面向對象的概念很難理解,functionnal編程通常是更容易和更可讀。

1

看到功能改變了範圍,最常見的方式是手工完成,像var self = this

var self = this 

$('.some_selector').each(function(){ 
    // refer to 'self' here 
} 
36

我喜歡你的樣子,其實使用了類似的結構:

$('#available_input').bind('click', {self:this}, this.onClick); 

和this.onClick的第一行:

var self = event.data.self; 

我喜歡這種方式,因爲這樣你會得到無論是元素點擊(如此)和「這個」對象作爲自己,而無需使用閉包。

32

jQuery的jQuery.proxy方法(從1.4開始可用)。

例子:

var Foo = { 
    name: "foo", 

    test: function() { 
    alert(this.name) 
    } 
} 

$("#test").click($.proxy(Foo.test, Foo)) 
// "foo" alerted 
4

您可以使用JavaScript bind方法是這樣的:

var coolFunction = function(){ 
    // here whatever involving this 
    alert(this.coolValue); 
} 

var object = {coolValue: "bla"}; 


$("#bla").bind('click', coolFunction.bind(object)); 
4

HTML 5兼容的瀏覽器提供一個bind methodFunction.prototype是,可能是最清晰的語法,而不是框架的依賴性,雖然它直到IE 9沒有內置到IE中。(但是,沒有它的瀏覽器有polyfill)。

根據您的示例,您可以像這樣使用它:

jQuery('#available input', 
     this.controlDiv).bind('click', this.availableCategoryClick.bind(this)); 

(邊注:在此語句中的第bind是jQuery的組成部分,並已完全與Function.prototype.bind做)

或者用稍微更簡潔了最新的jQuery(和消除混亂兩種不同的bind s):

$('#available input', this.controlDiv).click(this.availableCategoryClick.bind(this));