我正在尝试替换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("ibSubmit1", "", true, "Group1", "", 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值,但是如果我能让它工作的话,这似乎会更加优雅和灵活......
注意:如果我的控件有办法询问页面,那么它就会找到将回发的所有按钮(无论它们是什么类型的按钮),所以我可以检索属性服务器端,这也是我将考虑的事情。
答案 0 :(得分:3)
在解析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>
答案 1 :(得分:0)
通常,在ASP.NET中,要为按钮禁用此功能,请执行以下操作:
这会传递给客户端onclick,返回false;阻止默认实现。这是如何从服务器做到的;从客户端,您需要完全消除onclick并重新实现它。
我不知道我明白你要做什么......你为什么这样做?你这样做是为了传回额外的数据吗?如果是这样,还有其他方法可以实现......
答案 2 :(得分: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();
将被调用两次。