jQuery:form.submit(fn)在Asp.net上无法正常工作?

5

我试图在没有成功的asp.net渲染页面上附加一个form.submit事件处理程序。 我想拦截每个postback,文档说我应该能够做到。 我做错了什么吗?

$(document).ready(function() {
    $("form").submit(function() {
            alert('Form submit');
            debugger;
    });
});
3个回答

6

不知道你是否还在寻找,但这是我所拥有的解决方案。如果使用stopPropagation()进行事件取消,我不认为它会起作用,但它会让你在提交表单之前运行一些脚本。

<script type="text/javascript">
    $(function () {
        var oldSubmit = __doPostBack;
        var newSubmit = function (eventTarget, eventArgument) {
            alert('custom submit function');
            return oldSubmit(eventTarget, eventArgument);
        };
        __doPostBack = newSubmit;
    });
</script>

5

这是我在一个传统的WebForm应用程序上做的事情:

//trigger jquery form submit event handlers on __doPostBack
$(function() {
    var oldPostBack = __doPostBack;
    __doPostBack = function() {
        $("form").triggerHandler("submit");
        oldPostBack.apply(this, arguments);
    };
});

这样可以让你像平常一样使用jQuery来连接“submit”事件:
$("#myForm").submit(function() { alert("submitted!"); });

典型的doPostBack劫持,但只发生一次。在旧的postback之前,它会触发任何表单元素上的“提交”处理程序。这是必要的,因为尽管asp.net确实调用与表单dom对象附加的onsubmit函数,但它看起来不像jquery的事件工作方式。

+1 for $("form").triggerHandler("submit") -- $("form").submit()在FireFox上不起作用。 - Denis

3

ASP.NET WebForms通常只包含一个大表单(因此称为Web Forms)。

如果我没记错的话,所有链接和提交按钮都会手动调用__doPostBack函数,因此它会绕过调用表单提交并将该责任委托给__doPostBack函数。

您可能需要覆盖此函数。

<script type="text/javascript"> 
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script> 

尽管我试图理解您函数中的“debugger;”行。也许应该是这样的?
$(document).ready(function() {
    $("form").submit(function() {
            alert('Form submit');
    });
}); 

调试器允许我从VS中进入JavaScript代码并进行调试;你说得对关于_doPostBack,我以为jQueary会将处理程序附加到form.submit()。 - epitka
事件冒泡可能会成为一个问题。附加到onsubmit的另一个函数可能会调用event.stopPropagation和event.preventDefault()。__doPostBack正在检查onsubmit,如果在您之前有任何其他提交处理程序附加到事件并返回false或阻止冒泡,则您的提交处理程序将永远不会被调用。 - michael herndon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接