Javascript覆盖问题

时间:2009-07-15 11:39:53

标签: javascript

我用一种Javascript方法覆盖了一段时间的问题。问题是我在我的一个控件上有onclick事件处理程序,我需要在事件处理程序触发实际方法之前注入一些方法。

假设DGrid.Headerclik被实际分配给onclick事件。

这就是我所做的

  DGrid.Headerclik  = handleinLocal;

所以每当用户点击网格时,控件就会出现在handleinLocal方法中。在这里,我必须做一些处理,然后调用基础Headerclik()。

  function handleinLocal(){
      // here i need to call the DGrid.Headerclik() method (base)
  }

但是这没有按预期工作。在handleinLocal()中调用DGrid.Headerclik()时,递归调用handleinLocal()方法。但我需要调用基本方法......

有没有办法在JavaScript中实现???

4 个答案:

答案 0 :(得分:2)

您应该将前一个处理程序存储在(闭包)变量中:

(function() {
   var oldHandler = DGrid.Headerclik;

   DGrid.Headerclik = handleInLocal;

   function handleInLocal() {
      // ...
      oldHandler();
      // ...
   }
})();

答案 1 :(得分:2)

在重新分配自己的处理程序之前,将原始回调保存在变量中。然后,在完成了所需操作后,从变量中调用原始处理程序。

var callback = DGrid.Headerclik;
DGrid.Headerclik = handleinLocal;

function handleinLocal()
{
     ...your code...
     callback();  // invoke original handler
}

答案 2 :(得分:1)

将原始单击事件处理程序复制到变量,然后在新的单击事件处理程序中,调用原始单击处理程序

var oldOnClick = DGrid.Headerclik || function() {};

DGrid.Headerclik = handleinLocal;

function handleinLocal() {
   // Do what you need to do
   oldOnClick();         
}

答案 3 :(得分:0)

谢谢你们(全部)的回复..你的方法很优雅..这成功地调用了基本方法,我忘了告诉你一件事,DGrid是一个单独的函数得到了自己的方法&属性。我在这里又遇到了一个问题..

DGrid.Headerclik()iself使用'this'运算符来访问方法&来自其范围的属性..所以在调用oldHandler()时它在我的本地运行。不完全在DGrid范围内。 (此运算符仅返回不在DGrid中的页面的属性)

为了避免这种情况,我将oldHandler分配回DGrid.Headerclik并直接调用DGrid.Headerclik()..

var oldHandler = DGrid.Headerclik;   
DGrid.Headerclik = handleInLocal;
function handleInLocal(sColumnIdx){
    FormColumnWidthJSONArray();
    //OldHandler(sColumnIdx)    
     DGrid.Headerclik= OldSCCHandler;
    DGrid.Headerclik(sColumnIdx) // To Call the actual Column Click handler in DGrid;
    DGrid.Headerclik= HandleLocal;
}