我聲明一個變量,通過選擇框中的另一個事件獲取它的值。由於有不同的事件會改變變量(讓我們把它命名爲z
),我希望在變量發生變化時得到通知。是否有可能在javascript變量上發生更改事件?
所以我的問題是:什麼是最好的方式得到通知時變量得到改變? z.change(function(){});
將引發錯誤。
有沒有辦法做到這一點,沒有隱藏的輸入字段或其他像這樣的助手?
我聲明一個變量,通過選擇框中的另一個事件獲取它的值。由於有不同的事件會改變變量(讓我們把它命名爲z
),我希望在變量發生變化時得到通知。是否有可能在javascript變量上發生更改事件?
所以我的問題是:什麼是最好的方式得到通知時變量得到改變? z.change(function(){});
將引發錯誤。
有沒有辦法做到這一點,沒有隱藏的輸入字段或其他像這樣的助手?
這是不可能的,但是一些瀏覽器支持getter和setter,並且當它們值得機會時,你可以實現一些稱爲外部函數的東西。如果你想這在所有的瀏覽器,那麼你可以去這樣做的老式方法:
var Item = function (val) {
this._val = val;
}
Item.Prototype.setValue = function (val) {
this._val = val;
// call external function here!
}
Item.Prototype.getValue = function() {
return this._val;
}
然後永遠記住,只有通過這些功能的訪問屬性。
你應該對http://plugins.jquery.com/project/watch感興趣,它不像SpiderMonkey的方法完整,但實際上工作。
試試這個:
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition);
我用這個方法寫了一個雙向模型視圖結合jQuery插件jQueryMV https://github.com/gonnavis/jQueryMV。
謝謝,看起來很不錯,但是這是Prototype的做法吧?因爲我使用jQuery。我會嘗試重寫。 – Tim 2010-09-29 08:59:29
是的,這只是爲了展示一些代碼 - 修改它到你使用的任何框架:-) – AHM 2010-09-29 09:01:30
@Tim - 不,這不是'Prototype'框架,它只是Vanilla Javascript,沒有檢測到框架。 [這是一個鏈接](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/prototype)。 – Reigel 2010-09-29 09:22:33