代码之家  ›  专栏  ›  技术社区  ›  NightOwl888 Jabrwoky

如何使用JavaScript替换函数名并将其识别为函数?

  •  2
  • NightOwl888 Jabrwoky  · 技术社区  · 14 年前

    我正在尝试替换中的JavaScript onclick事件处理程序ASP.NET在使用验证控件时添加到按钮控件的。这是从输出到HTML的内容ASP.NET在这种情况下:

    <input type="image" name="ibSubmit1" id="ibSubmit1" src="button-green-submit.gif" onclick="showProgress1();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ibSubmit1&quot;, &quot;&quot;, true, &quot;Group1&quot;, &quot;&quot;, false, false))" style="border-width:0px;" />
    

    我看起来很敬重,不幸的是,在函数服务器端被注入页面之前,似乎没有办法修改它。

    validationGroup参数 对于WebForm\u PostBackOptions对象,似乎最简单的解决方案是使用JavaScript将WebForm\u DoPostBackWithOptions函数名替换为我的自定义包装函数,并保留所有剩余的参数信息—然后我可以提取我感兴趣的信息,调用我的自定义函数,然后用options将调用转发到WebForm\u dopostback。

        $('[onclick*=WebForm_DoPostBackWithOptions]').each(function() {
            var txt = this.onclick;
            txt = txt + '';
            txt = txt.replace('WebForm_DoPostBackWithOptions','ml_DoPostBackWithOptions');
            this.onclick = eval(txt);
        });
    

    使用alert(),我验证了文本是否被正确更改,但是无论是否使用eval()函数,onclick处理程序似乎都无法将其识别为JavaScript。

    注意:如果有一种方法让我的控件查询页面,那么它将打开以查找 将发回 (不管它们是什么类型的按钮),所以我可以检索属性服务器端,这也是我会考虑的。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Guffa    14 年前

    为什么不重新定义所调用的函数呢?把这个放在这一页的末尾:

    <script type="text/javascript">
    
    (function(){
    
      // keep the original
      var previous = WebForm_DoPostBackWithOptions;
    
      WebForm_DoPostBackWithOptions = function(options) {
        // do what you want with the options here
        // then call the original
        previous(options);
      }
    
    })();
    
    </script>
    
        2
  •  0
  •   Brian Mains    14 年前

    通常,在ASP.NET,要对按钮禁用此选项,请执行以下操作:

    这将传递给客户端onclick,返回false;阻止默认实现。这就是如何从服务器上完成的;从客户机上,您需要彻底清除onclick并重新实现它。

    我不知道我明白你想做什么。。。你为什么这样做?你这样做是为了传回额外的数据吗?如果是的话,还有其他的方法来实现。。。

        3
  •  0
  •   Daniel Dyson    14 年前

    如果您只是尝试向click事件插入功能,那么可以使用jQuery的click()函数。它将函数调用添加到click事件的开头,然后允许出现默认行为,在本例中是表单提交:

     $(function() {
        $('[onclick*=WebForm_DoPostBackWithOptions]').click(function(event) {  
    
            //call your custom functions here and then do nothing, the 
            //default click event will still occur. If you don't want it to
            //propagate, call event.preventDefault();
    
            var txt = this.onclick;
            txt = txt + '';
            txt = txt.replace('WebForm_DoPostBackWithOptions','ml_DoPostBackWithOptions');
            setTimeout(txt,0);
    
            //event.preventDefault();  
            //or
            //event.stopPropagation();  
        });
     });
    

    showProgress1(); 会接到两次电话。