2012-07-25 14 views
2

我正在開發一個JavaScript項目,我們正在爲我們在辦公室使用的組織網站構建一個Greasemonkey插件。我們無法讓我們的更改保持呈現狀態,因爲我們不能簡單地將更改注入現有的呈現功能。如何將函數綁定到Javascript中對象的數據成員中的更改?

因此,我們需要找到渲染髮生的每個事件並在那裏注入我們自己的渲染函數。然而,我們可以看到一些事件發生,但我們無法將它們掛鉤。我想知道的是如何將一個函數綁定到對象的數據成員,以便該成員更改時調用該函數。我們的一個團隊成員似乎認爲這是可能的,但他告訴我們使用的方法似乎並不奏效。

我們嘗試什麼沿

window.Controller.bind("change:idBoardCurrent", OMGITWORKED); 

其中idBoardCurrentwindow.ControllerOMGITWORKED成員線的東西是我們想要的功能時window.Controller.idBoardCurrent改變時被調用。

我對JavaScript或數據綁定不是很熟悉,所以我不知道這是對還是錯,或者它是正確的還是不正確的。如果有人能指出在這個片段中要改變什麼,或者如果他們能夠提出另一種方式來解決這個問題,我會非常感激。

回答

2

您可以使用Object.defineProperty定義的對象屬性

Object.defineProperty(window.Controller,"idBoardCurrent",{ 
     get : function() { return this.val; }, 
     set : function(value) {this.val = value;OMGITWORKED(value); } 
}); 
function OMGITWORKED(param) { 
    console.log("idBoardCurrent has been Changed to " + param); 
} 

window.Controller.idBoardCurrent = "Test"; 
window.Controller.idBoardCurrent = "Test2"; 
console.log(window.Controller.idBoardCurrent) 

編輯setter和getter:根據上下文對象

JSBin

+0

你的答案看起來很有希望,但這裏的對象(window.Controller)沒有defineProperty方法。它只有一個綁定方法,這就是我們最初使用它的原因。 – 2012-07-25 13:44:45

+0

window.Controller對象來自哪裏? 你不能做Object.defineProperty(window.Controller',「idBoardCurrent」,....)' 因爲它的一個Object,所以「main」對象方法(defineProperty)應該能夠定義一個properties它。 (不是window.Controller有方法,它的javascripts Object對象) – C5H8NNaO4 2012-07-25 13:50:24

+0

非常感謝。藉助我有限的Javascript體驗,我並沒有意識到自己最初的意思,但是我實現了您所做的更改並且完美地工作! – 2012-07-25 14:00:00

1

由於這是特別的Firefox,您可以使用它提供的mutation events

  • 對他們來說,W3C規範從未廣泛實施,現在是棄用
  • 使用DOM突變事件「顯著降低」 DOM的性能改裝
:但是從頁面注意對他們的警告

如果您能夠將自己限制在Firefox 14及更高版本,則可以使用新的mutation observers stuff

相關問題