0

我(“仍然”,对于那些阅读我以前的帖子的人来说)正在开发一个 ICEFaces Web 应用程序。

这个问题可以解释为一般的 Javascript 问题,所以如果你对 ICEFaces 不太了解,请继续阅读

我需要扩展由 ICEFaces Javascript 框架创建的类的行为,特别是ToolTipPanelPopup.

我不能修改库的源代码(否则我会实现我的目标)。这就是ICEFaces 定义类的方式(很像jQuery 和其他Javascript 框架)。

ToolTipPanelPopup = Class.create({
   [...]
  showPopup: function() {
    [...]
  },


  updateCordinate: function(event) {
     [...]
  },

    [...]
});

我的问题很简单

如何扩展showPopup()函数的行为以便在它结束时运行我的自定义函数?

我的意思是遵循假设继承的Java示例代码

public void ShowPopup()
{
    super.ShowPopup();
    customMethod();
}
4

1 回答 1

1

像这样的东西应该工作:

var original = ToolTipPanel.showPopup;
ToolTipPanel.showPopup = function() {
   original();  //this is kind of like the call to super.showPopup()
   //your code
};

我在 Firebug 中尝试了这个简单的例子,它似乎有效:

var obj = {
   func: function() { 
     console.log("foo"); 
   }
};

obj.func();

var original = obj.func;
obj.func = function() {
   original();
   console.log("bar");
};

obj.func();

萤火虫输出:

foo
foo
bar

所以这里发生的是你正在保存对原始showPopup函数的引用。然后,您正在创建一个闭包并将其分配回showPopup. 原件showPopup并没有丢失,因为您仍然在original. 在闭包中,您调用original引用的函数,然后您拥有自己的代码。如果您想在打电话之前先做某事,只需交换订单即可original。由于您使用的是闭包,original因此在词法上绑定到当前范围,并且每次showPopup调用 new 时都应该可用(如果我对此有误,请有人纠正我)。

让我知道这是否适合您。

于 2011-04-20T16:11:21.657 回答