2012-07-26 86 views
4

我創建了幾個DOM元素動態喜歡,對象有沒有方法「應用」

var anchorElement = jQuery('<a />',{text:property.text}); 
var liElement = jQuery('<li />',{"class":"navlink_"+i,id:"navlink_"+i}); 
anchorElement.on('click',property.fnctn); 
liElement.append(anchorElement); 
parentID.append(liElement); 

property是一個JSON對象。 property.text是我想要放入錨元素的文本。 (Works fine)

我想附加一個點擊事件處理程序到該錨點元素。 需要該功能被綁定到該元素在JSON被指定,我們可以訪問它像

property.fnctn 

下面的行應綁定事件處理程序至錨定元件。

anchorElement.on('click',property.fnctn); 

這是行不通的,所以我試圖將其轉換成字符串像,

anchorElement.on('click',property.fnctn.toString()); 

沒有成功...

當我點擊這個鏈接,則會在控制檯中的錯誤

該對象沒有「應用」方法。 是什麼原因...?

我能得到它有輕微的工作工作周圍像

anchorElement.attr('onclick',property.fnctn+"()"); 

上述聲明的作品,但我想知道爲什麼.on() API不工作。

謝謝:) AÐitya。

+0

什麼'property.fnctn'的價值? – 2012-07-26 09:30:09

+0

它串... 我已經定義了幾個功能,各自的功能名稱在property.fnctn 我遍歷JSON數組,所以新的值,每次.. 這是JSON結構 {「item1」:{「text」:「錢包」,「fnctn」:「walletClick」}}, {「item2」:{「text」:「Pay Someone」,「fnctn」:「paySomeoneClick」 }}, {「item3」:{「text」:「支付賬單」,「fnctn」:「payBillsClick」}} – AdityaParab 2012-07-26 09:31:46

+0

包含什麼的字符串?函數的名稱或函數的定義? – 2012-07-26 09:32:14

回答

8

更新

你們已經說property.actfn是一個字符串,"paySomeoneClick"。最好不要使用字符串作爲事件處理程序,而應使用函數。如果你想要的功能paySomeoneClick,在字符串中定義的,被稱爲,如果該功能是全局的,你可以這樣做:

anchorElement.on('click',function(event) { 
    return window[property.fnctn](event); 
}); 

做是因爲全局函數全局對象,這是可以的性質通過瀏覽器上的window,以及下面描述的括號表示。

如果函數是一個對象,你有一個參照,則:

anchorElement.on('click',function(event) { 
    return theObject[property.fnctn](event); 
}); 

做是因爲在JavaScript中,您可以通過以下兩種方式訪問​​對象的屬性:點符號與文字屬性的名稱( foo.barfoo上訪問bar示例)並使用字符串屬性名稱(foo["bar"])括起來的表示法。它們是等價的,除了括號內的符號外,該字符串可以是表達式的結果,包括來自像property.fnctn這樣的屬性值。

但我會建議退後一步,重構一下,所以你不會在字符串中傳遞函數名。有時候這是正確的答案,但以我的經驗,並不經常。 :-)

原來的答覆

(這個假設property.fnctn是一個函數,而不是一個字符串,但可能會有一些使用的人的...。)

代碼

anchorElement.on('click',property.fnctn); 

會將函數附加到事件中,但在調用函數期間,this將引用DOM元素不是到您的property對象。

要解決這個問題,使用jQuery的$.proxy

anchorElement.on('click',$.proxy(property.fnctn, property)); 

...或ES5的Function#bind

anchorElement.on('click',property.fnctn.bind(property)); 

...或關閉:

anchorElement.on('click',function(event) { 
    return property.fnctn(event); 
}); 

更多閱讀(在我的博客):

+0

謝謝T.J! 明白了... 可能是我需要與我的項目經理交談,以考慮重新設計這種方法...:) 好吧,有什麼理由爲什麼不使用字符串作爲事件處理程序? (只是好奇而已) – AdityaParab 2012-07-26 09:41:52

+2

@AdityaParab:重新使用字符串分配給'click'處理程序,這不是一個好主意,因爲它需要JavaScript解析器啓動並解析字符串,並且會遮蔽正在發生的事情。重新傳遞函數名稱時,會混淆* code *和* data *,這通常(但並非總是)不太理想。如果你可以抽象一點,傳遞你的代碼然後解釋爲「哦,這意味着我們應該調用這個函數」的信息,通常它是最好的。但是,當服務器代碼向客戶端代碼發送消息時,傳遞函數名稱可能會有真實的參數。最好的, – 2012-07-26 09:44:48

+0

Got it!謝謝:) – AdityaParab 2012-07-26 09:46:27