3

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

<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;" />

我看起来很漂亮,不幸的是,似乎没有办法在将功能服务器端注入页面之前对其进行修改。

由于我正在开发一个控件并希望它是非侵入性和自包含的,并且我有兴趣获取 WebForm_PostBackOptions 对象的validationGroup 参数,因此似乎最简单的解决方案是使用 JavaScript 将 WebForm_DoPostBackWithOptions 函数名称替换为我的自定义包装函数并保留所有其余参数信息不变 - 然后我可以提取我感兴趣的信息,调用我的自定义函数,然后将调用转发到 WebForm_DoPostBackWithOptions。

注意:我正在使用 jQuery 来构建我的自定义函数,所以如果有更简单的方法来使用 jQuery 执行此操作,我会考虑使用它。

这是我尝试替换 onclick 事件处理程序的代码(不起作用):

    $('[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。

我想过使用正则表达式来获取validationGroup值,但是如果我能让它工作,这似乎会更加优雅和灵活......

注意:如果我的控件有办法查询它所在的页面,以找到所有将回发的按钮(无论它们是什么类型的按钮),以便我可以检索服务器端的属性,这也是我会考虑的。

4

3 回答 3

5

解析 HTML 时,属性值被包装在一个函数中,因此要取回原始字符串会很棘手。您可以获得函数的字符串表示形式,但随后您必须解析出函数内部的代码。

为什么不重新定义被调用的函数呢?把它放在页面的末尾:

<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>
于 2010-08-25T11:31:19.707 回答
0

通常,在 ASP.NET 中,要为按钮禁用此功能,您可以:

这被传递到客户端 onclick,并返回 false;阻止默认实现。这就是从服务器执行此操作的方法;从客户端,您需要完全清除 onclick 并重新实现它。

我不知道我理解你想要做什么......你为什么要这样做?你这样做是为了传回额外的数据吗?如果是这样,还有其他方法可以实现...

于 2010-08-25T11:28:42.240 回答
0

如果您只是想向 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();将被调用两次。

于 2010-08-25T11:50:04.690 回答