2012-04-04 92 views
2

我有一個jQuery(UI)應用程序,在這裏整個JQuery代碼有點混亂,所以我開始思考如何以一種更有趣的方式構造這個...我讀一篇博客文章的地方,即「空中接力」 - 在Java的方式可以通過執行某種實現這一目標:jquery回調函數 - 「這個」

function RangeSelector(product_id) { 
    this.product_id = product_id; 
    this.start_point = "#from_" + product_id; 
    this.end_point = "#to_" + product_id; 
} 
RangeSelector.prototype.myFunction = function() { } 

整個代碼可以發現here

我的量程選擇「類」應該保持兩個jQuery UI的datetimepickers,負責,讓用戶選擇日期時間範圍內的商店,你可以租產品

的問題,我目前有如下:日期時間選擇器獲得回調函數(「unavailableFrom」,「unavailableTo」),我想做一些特定的事情,然後調用通用的「不可用」來運行。 的錯誤信息是:

TypeError: 'undefined' is not a function (evaluating 'this.unavailable(date)') 

我環顧四周,與螢火蟲,似乎,那RangeSelector的「這」不是我的目標,但對什麼的DateTimePicker工作的HTML元素。 我的問題是:如何訪問此方法「不可用」?

順便說一下,我在這裏告訴你整個故事,因爲我不認爲,我在這裏選擇的結構是正確的路要走。你如何處理這些類型的東西,你有多個具有通用含義的html元素,並且你想聚合它們?

+0

如果我理解你以及你需要綁定的方法的上下文,這在javascript不是實例,但背景中的函數被調用。這就是爲什麼要使用JavaScript是如此的困難,因爲它使用的是什麼都沒有做的是定義一個通常給他們的關鍵字,這樣你就可以創建一個功能綁定:功能_bind(_function,_context){ 恢復功能(){ 回報_function。申請(_context,自變量); }} THX – mpm 2012-04-04 11:22:35

回答

5

如果您需要將this設置爲不同的值,則可以使用jQuery.proxy來完成此操作。 (或者在支持ES5的環境中,可以使用新的Function#bind函數。)proxy接受用於this的函數和值,並返回一個函數,該函數將調用原始函數this設置爲該值。

因此,舉例來說,假設你有你的RangeSelector,你想click對特定實例觸發myFunction

var r = new RangeSelector(/* ...args...*/); 
$("some_selector").click($.proxy(r.myFunction, r)); 

現在,當r.myFunction被調用,調用中,this將在參考r對象。 (如果您需要知道哪個DOM元素被點擊,請myFunction接受參數,jQuery通過它,並使用event.target。)

爲了完整起見,使用上述Function#bind(如果瀏覽器支持ES5特徵,或已包含一個ES5墊片[自Function#bind是墊片能夠]):

var r = new RangeSelector(/* ...args...*/); 
$("some_selector").click(r.myFunction.bind(r)); 

更多探索(上我的博客):


的jQuery UI的datepickeronSelect是有點痛的,因爲他們不給你event對象,所以你不必event.target訪問。您最好的選擇有可能是穿過那些元素封閉:

var r = new RangeSelector(/* ...args...*/); 
$("some_selector")..datepicker({ 
    onSelect: function(dateText, inst) { 
     return r.myFunction(dateText, inst, this); 
      } 
}); 

...其中myFunction接受dateTextinstelement參數。

Live example | source

這是有效的,因爲我們分配給onSelect的函數是包含r變量的環境的閉包。

瓶蓋經常誤解; FWIW,另一個博客條目:Closures are not complicated

+0

,即偉大工程,直到我意識到,在其他功能「ONSELECT」,我需要訪問的範圍內選擇對象以及實際的日期選擇器的html元素對象 - 你可以給我的一個小例子這:「(如果你需要知道哪個DOM元素被點擊,讓myFunction接受jQuery傳遞它的事件參數,並使用event.target。)」? – 2012-04-04 11:42:42

+0

@MarioDavid:啊,jQuery UI的datepicker'onSelect'是一個痛苦。更新。 – 2012-04-04 12:18:32

0

關鍵字this正在改變你的範圍,所以它並不意味着在你所期望的不同地方同樣的事情。我建議你明確地將你正在使用的元素在函數中傳遞,並直接引用該元素,而不是試圖用this來區分範圍。

+0

OK,那將是我已經想到了替代,但它不是我清楚,如何任何類型​​的對象的一傳回調方法,做這樣的事情的時候:「beforeShowDay:this.unavailableFrom」 - 它只是:「beforeShowDay:this.unavailableFrom(myVar)」? – 2012-04-04 11:44:37