Javascript 每次值更改时运行一个方法

Javascript 每次值更改时运行一个方法,javascript,events,observer-pattern,thunderbird,Javascript,Events,Observer Pattern,Thunderbird,我想知道你们中是否有人能帮我解决我认为的问题 我有一个元素(更具体地说是svg),每当某个地方的值发生更改时,我都要更新它 我有一个变量: GetThreadTree().treeBoxObject.getFirstVisibleRow()初始值为0。每次GetThreadTree().treeBoxObject.getFirstVisibleRow()的值更改时,我都要运行函数updateCanvas() 我得到的是: canvas.observe(GetThreadTree().treeBo

我想知道你们中是否有人能帮我解决我认为的问题

我有一个元素(更具体地说是svg),每当某个地方的值发生更改时,我都要更新它

我有一个变量:
GetThreadTree().treeBoxObject.getFirstVisibleRow()
初始值为0。每次
GetThreadTree().treeBoxObject.getFirstVisibleRow()的值更改时,我都要运行
函数updateCanvas()

我得到的是:

canvas.observe(GetThreadTree().treeBoxObject.getFirstVisibleRow(), "scroll", updateCanvas());
但是当它第一次被调用时,它只调用一次
updateCanvas()
,并且由于某种原因,它不会执行后面的代码。我检查了错误控制台,但什么都没有


有什么想法吗?

你的逻辑全错了。当您更新您的值时,需要由函数在一个位置执行的操作,如treeBoxObject.IncrementRow()或类似操作

然后,您可以让该函数触发一个事件,如OnTereboxRowIncremented。这个事件就是你所关注的,当它发生变化时,你可以进行检查并更新任何你喜欢的内容


请原谅这些奇怪的函数名只是试图使用您现有的函数名。

解决此问题的一种方法是:

var registeredRow = 0;

function checkRow(){
    var row = GetThreadTree().treeBoxObject.getFirstVisibleRow();
    if (registeredRow != row) {
        registeredRow = row;
        updateCanvas();
    }
    window.setTimeout(checkRow, 1);
}
在调用checkRow之前:

registeredRow = GetThreadTree().treeBoxObject.getFirstVisibleRow();
checkRow();

但这不是最优雅的解决方案,但它确实有效;)

这有帮助吗:还有,平台是什么?浏览器Javascript版本?它没有帮助,效果仍然和我的问题一样。它是为Thunderbird 3.0b4pre设计的,所以我想JavaScript版本是最新的版本之一。