Javascript覆盖问题

Javascript覆盖问题,javascript,Javascript,有一段时间,我遇到了一个Javascript方法覆盖问题。问题是我在一个控件上得到了onclick事件处理程序,我需要在事件处理程序触发实际方法之前注入一些方法 假设DGrid.Headerclik实际分配给onclick事件 这就是我所做的 DGrid.Headerclik = handleinLocal; 因此,每当用户单击网格时,控件都会转到handleinLocal方法。在这里,我必须进行一些处理,然后调用基本Headerclik() 但这并不像预期的那样有效。在调用handle

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

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

这就是我所做的

  DGrid.Headerclik  = handleinLocal;
因此,每当用户单击网格时,控件都会转到handleinLocal方法。在这里,我必须进行一些处理,然后调用基本Headerclik()

但这并不像预期的那样有效。在调用handleinLocal()中的DGrid.Headerclik()时,递归调用handleinLocal()方法。但是我需要调用基本方法


有没有一种方法可以在JavaScript中实现它们???

您应该将前面的处理程序存储在(closure)变量中:

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

   DGrid.Headerclik = handleInLocal;

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

将原始回调保存在变量中,然后再将其重新分配给自己的处理程序。然后,在完成需要执行的操作后,从变量调用原始处理程序

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

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

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

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

DGrid.Headerclik = handleinLocal;

function handleinLocal() {
   // Do what you need to do
   oldOnClick();         
}
谢谢大家的回复。。你的方法很优雅。。这成功地调用了基方法,我忘了告诉你一件事,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;
}

看起来您对
DGrid的调用。Headerclick
似乎正在执行DOM调用,因此您可能患有可怕的DOM Livequery综合症。我可能错了,虽然男生没有回答我自己的问题,我只是想准确地输入,那就是我在使用答案选项。。为什么stack没有支持纯文本的回复选项。。??这个我真的很讨厌。。。
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;
}