我声明一个变量,通过选择框中的另一个事件获取它的值。由于有不同的事件会改变变量(让我们把它命名为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