2013-04-25 53 views
-1

我有包含其值是一個jQuery功能的屬性的對象中的對象:jQuery函數作爲對象的屬性值

var fields = { 
    id: {}, 
    timeStarted: {}, 
    duration: {}, 
    status: {}, 
    name: { 
     field: $("#companyName"), 
     changeEvent: $("#companyName").on("click", function(){ 
      alert("bazinga!"); 
     }) 
    } 
}; 

我也有另一種功能,其穿過內fields找到的所有值並嘗試註冊變更事件:

function registerChangeEvents(){ 
    $.each(fields, function(field, v){ 
     $.each(v, function(prop, vv){ 
      // check which property the loop is on: if changeEvent 
      if (prop == "changeEvent"){ 
       vv(); 
      } 
     }); 
    }); 
} 

當我運行registerChangeEvents()然而,控制檯返回Uncaught TypeError: object is not a function。我可以使用function(){...}changeEvent的值包裝起來,這將使它成爲可以正常運行的函數。不過,出於某種原因,這看起來並不是正確的做法。

如果您有任何想法,請告訴我。

謝謝。

+0

它不是一個功能,它是結果調用這些jQuery函數(事實證明這是一個jQuery包裝器對象)。 (除非你想使用'$ .fn.click.bind($(「#companyName」),alert.bind(window,「bazinga!」))'' ) – Bergi 2013-04-25 16:32:42

回答

2

當你有這樣的:

changeEvent: $("#companyName").on("click", function(){ 
    alert("bazinga!"); 
}) 

代碼,立即執行和.on()結果是原來選擇的對象......這僅僅是$("#companyName")。所以changeEvent被設置爲一個jQuery對象,其中包含具有id「companyName」的元素。

我會改變name是:

name: { 
    field: "#companyName", 
    changeEvent: function(){ 
     alert("bazinga!"); 
    } 
} 

,然後改變你的函數是:

function registerChangeEvents(){ 
    $.each(fields, function(prop, v){ 
     var field, changeEvent; 
     $.each(v, function(propp, vv){ 
      if (propp === "field") field = vv; 
      if (propp === "changeEvent") changeEvent = vv; 
     }); 
     if (field && changeEvent) $(field).on("change", changeEvent); 
    }); 
} 

我感到困惑一樣東西 - 你怎麼稱呼它 「changeEvent中」,但原始代碼中的event用於「點擊」。

+0

感謝您的回答。我假設我的第一個建議(在javascript函數中包裝'changeEvent'的值)是最好的,在這種情況下呢?此外,我很抱歉沒有提到這一點,但'registerChangeEvents()'是在某個Ajax調用完成後被觸發的。 – zeddotes 2013-04-25 15:47:57

+0

不同的'fields'將會有不同的'changeEvents',它們不僅限於'click's,這就是我爲什麼要這麼叫的原因。例如,我正在使用Bootstrap的僞單選按鈕,它不會觸發本地更改事件。 – zeddotes 2013-04-25 15:50:14

+0

調用'registerChangeEvents()',以便我可以爲所有將通過Ajax調用的字段創建這些更改事件。 – zeddotes 2013-04-25 15:50:53

1

如果您要註冊的更改事件,你需要用單擊處理程序附件:

name: { 
    field: $("#companyName"), 
    changeEvent: function() { 
     this.field.on("click", function(){ 
      alert("bazinga!"); 
     }); 
    } 
} 

然後調用它像這樣:

$.each(fields, function(field, v) { 
    if ($.isFunction(v.changeEvent)) { 
     v.changeEvent(); 
    } 
} 
相關問題