代码之家  ›  专栏  ›  技术社区  ›  RameshVel

javascript覆盖问题

  •  3
  • RameshVel  · 技术社区  · 15 年前

    我发现了一个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中实现theis的方法??

    4 回复  |  直到 13 年前
        1
  •  2
  •   Philippe Leybaert    15 年前

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

    (function() {
       var oldHandler = DGrid.Headerclik;
    
       DGrid.Headerclik = handleInLocal;
    
       function handleInLocal() {
          // ...
          oldHandler();
          // ...
       }
    })();
    
        2
  •  2
  •   tvanfosson    15 年前

    将原始回调保存在变量中,然后重新分配自己的处理程序。然后,在您完成了需要做的事情之后,从变量中调用原始处理程序。

    var callback = DGrid.Headerclik;
    DGrid.Headerclik = handleinLocal;
    
    function handleinLocal()
    {
         ...your code...
         callback();  // invoke original handler
    }
    
        3
  •  1
  •   Russ Cam    15 年前

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

    var oldOnClick = DGrid.Headerclik || function() {};
    
    DGrid.Headerclik = handleinLocal;
    
    function handleinLocal() {
       // Do what you need to do
       oldOnClick();         
    }
    
        4
  •  0
  •   RameshVel    15 年前

    谢谢大家的回复。你的方法很优雅……这成功地调用了基方法,我忘了再告诉你一件事,dgrid是一个单独的函数,它有自己的方法和属性。我还有一个问题……

    dgrid.headerclik()iself使用“this”运算符从其作用域访问方法和属性。因此,在调用oldHandler()时,它在本地运行。不完全在dgrid范围内。(此运算符只返回我的页的属性,不在dgrid中)

    为了避免这种情况,我将旧处理程序分配回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;
    }