【问题标题】:Javascript Overriding issueJavascript覆盖问题
【发布时间】:2009-07-15 11:39:52
【问题描述】:

我遇到了一段时间的 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 中实现 thisis??

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    (function() {
       var oldHandler = DGrid.Headerclik;
    
       DGrid.Headerclik = handleInLocal;
    
       function handleInLocal() {
          // ...
          oldHandler();
          // ...
       }
    })();
    

    【讨论】:

      【解决方案2】:

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

      var callback = DGrid.Headerclik;
      DGrid.Headerclik = handleinLocal;
      
      function handleinLocal()
      {
           ...your code...
           callback();  // invoke original handler
      }
      

      【讨论】:

        【解决方案3】:

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

        var oldOnClick = DGrid.Headerclik || function() {};
        
        DGrid.Headerclik = handleinLocal;
        
        function handleinLocal() {
           // Do what you need to do
           oldOnClick();         
        }
        

        【讨论】:

          【解决方案4】:

          谢谢大家(所有人)的回复..你的方法很优雅..这成功地调用了基本方法,我忘了告诉你一件事,DGrid 是一个独立的函数,有自己的方法和属性。我这里还有一个问题..

          DGrid.Headerclik() 自己使用 '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 综合症。不过我可能是错的
          • 伙计们没有回答我自己的问题,我只是想准确输入,那就是你正在使用答案选项..为什么堆栈没有带有简洁文本支持的回复选项..??这个我真的很讨厌......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-15
          • 2021-09-10
          • 2021-01-03
          • 1970-01-01
          相关资源
          最近更新 更多