某个变量的值更改时,是否可能在JS中触发事件? 接受JQuery。

#1楼

对于几年后的调优:

提供了适用于大多数浏览器(和IE6 +)的解决方案,该解决方案使用onpropertychange事件和更新的规范defineProperty。 轻微的缺点是您需要使变量成为dom对象。

详细信息:

#2楼

抱歉,打了个旧话题,但是对于那些不了解Eli Grey的示例如何工作的人,这里有一些手册:

var test = new Object();
test.watch("elem", function(prop,oldval,newval){
//Your code
return newval;
});

希望这可以帮助某人

#3楼

不直接:您需要一对具有某种“ addListener / removeListener”接口的吸气剂/吸气剂或NPAPI插件(但这完全是另一回事了)。

#4楼

没有。

但是,如果真的那么重要,则有两种选择(第一种经过测试,第二种未经测试):

首先,使用setter和getter,如下所示:

var myobj = {a : 1};
function create_gets_sets(obj) { // make this a framework/global function
var proxy = {}
for ( var i in obj ) {
if (obj.hasOwnProperty(i)) {
var k = i;
proxy["set_"+i] = function (val) { this[k] = val; };
proxy["get_"+i] = function () { return this[k]; };
}
}
for (var i in proxy) {
if (proxy.hasOwnProperty(i)) {
obj[i] = proxy[i];
}
}
}
create_gets_sets(myobj);
那么您可以执行以下操作:
function listen_to(obj, prop, handler) {
var current_setter = obj["set_" + prop];
var old_val = obj["get_" + prop]();
obj["set_" + prop] = function(val) { current_setter.apply(obj, [old_val, val]); handler(val));
}
然后将侦听器设置为:
listen_to(myobj, "a", function(oldval, newval) {
alert("old : " + oldval + " new : " + newval);
}

其次,我实际上忘记了,我会在考虑的同时提交:)

编辑:哦,我记得:)您可以将手表放在值上:

给定上面的myobj,上面带有“ a”:

function watch(obj, prop, handler) { // make this a framework/global function
var currval = obj[prop];
function callback() {
if (obj[prop] != currval) {
var temp = currval;
currval = obj[prop];
handler(temp, currval);
}
}
return callback;
}
var myhandler = function (oldval, newval) {
//do something
};
var intervalH = setInterval(watch(myobj, "a", myhandler), 100);
myobj.set_a(2);

#5楼

作为Luke Schafer的答案 ( 请注意 :这是他的原始帖子;但是,此处的要点在编辑后仍然有效 ),我还建议使用一对Get / Set方法来访问您的值。

但是,我建议您进行一些修改(这就是为什么我要发布...)。

该代码的问题在于,可以直接访问对象myobj的字段a ,因此可以在不触发侦听器的情况下对其进行访问/更改其值:

var myobj = { a : 5, get_a : function() { return this.a;}, set_a : function(val) { this.a = val; }}
/* add listeners ... */
myobj.a = 10; // no listeners called!
封装形式
因此,为了确保确实调用了侦听器,我们必须禁止对该字段a直接访问。 怎么做? 使用闭包 !
var myobj = (function() { // Anonymous function to create scope.
var a = 5; // 'a' is local to this function
// and cannot be directly accessed from outside
// this anonymous function's scope
return {
get_a : function() { return a; }, // These functions are closures:
set_a : function(val) { a = val; } // they keep reference to
// something ('a') that was on scope
// where they were defined
};
})();

现在,您可以用同样的方法来创建并添加监听卢克提出,但你可以放心,有来读取或写入没有可能的方式a要被忽视!

以编程方式添加封装的字段

仍然在Luke的轨道上,我现在提出一种简单的方法,即通过简单的函数调用将封装的字段以及相应的getter / setter添加到对象。

请注意,这仅适用于值类型 。 为了使它与引用类型一起使用 ,必须实现某种深度复制 (例如,参见此副本)。

function addProperty(obj, name, initial) {
var field = initial;
obj["get_" + name] = function() { return field; }
obj["set_" + name] = function(val) { field = val; }
}

它的工作原理与以前相同:我们在函数上创建一个局部变量,然后创建一个闭包。

如何使用它? 简单:

var myobj = {};
addProperty(myobj, "total", 0);
window.alert(myobj.get_total() == 0);
myobj.set_total(10);
window.alert(myobj.get_total() == 10);