如何在ASP.NET应用程序中使用jQuery捕获提交事件?

Her*_*ill 29 asp.net jquery webforms form-submit

我正在尝试使用jQuery 处理元素submit事件form.

    $("form").bind("submit", function() {
        alert("You are submitting!");
    });
Run Code Online (Sandbox Code Playgroud)

当表单提交时(作为回发的一部分,例如当我点击按钮或链接按钮时),它永远不会触发.

有没有办法让这项工作?我可以附加触发提交的各个元素的事件,但这不太理想 - 有太多的可能性(例如具有autopostback = true的下拉列表,键盘快捷键等)


更新:这是一个最小的测试用例 - 这是我的aspx页面的全部内容:

<%@ page language="vb" autoeventwireup="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:scriptmanager id="ScriptManager" runat="server" enablepartialrendering="true">
                <scripts>
                    <asp:scriptreference path="/Standard/Core/Javascript/Jquery.min.js" />
                </scripts>
            </asp:scriptmanager>
            <p>
                <asp:linkbutton id="TestButton" text="Click me!" runat="server" /></p>
        </div>
    </form>

    <script type="text/javascript">
        $(document).ready(function() {
            alert("Document ready.");
            $("form").submit(function() {
                alert("Submit detected.");
            });
        });
    </script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我点击链接按钮时收到"文档就绪"警报,但没有"提交检测到".

Her*_*ill 34

谢谢,@ Ken Browning和@russau将我指向劫持__doPostBack的方向.我已经看到了几种不同的方法:

  1. 硬编码我自己的__doPostBack版本,稍后将其放在页面上,以便覆盖标准版本.
  2. 在页面上重载渲染并将我自己的自定义代码注入现有的__doPostBack.
  3. 利用Javascript的功能特性,创建一个钩子,为__doPostBack添加功能.

前两个似乎是不可取的,原因有两个(例如,假设将来其他人需要将自己的功能添加到__doPostBack),所以我已经选择了#3.

这个addToPostBack函数是我用来添加函数的常见pre-jQuery技术的变体,window.onload,它运行良好:

addToPostBack = function(func) {
    var old__doPostBack = __doPostBack;
    if (typeof __doPostBack != 'function') {
        __doPostBack = func;
    } else {
        __doPostBack = function(t, a) {
            if (func(t, a)) old__doPostBack(t, a);
        }
    }
};

$(document).ready(function() {
    alert("Document ready.");
    addToPostBack(function(t,a) {
        return confirm("Really?")
    });
});
Run Code Online (Sandbox Code Playgroud)

编辑:更改addToPostBack以便

  1. 它可以采用与__doPostBack相同的参数
  2. 正在添加的函数发生在__doPostBack之前
  3. 添加的函数可以返回false以中止回发


Jam*_*ack 14

我已经成功地使用了覆盖的解决方案,__doPostBack()以便在form.submit()(即$('form:first').submit(myHandler))上调用覆盖,但我认为它是过度设计的.从ASP.NET 2.0开始,最简单的解决方法是:

  1. 定义要在提交表单时运行的javascript函数,即

    <script type="text/javascript">
    
    function myhandler()
    {
        alert('you submitted!');
    }
    
    </script>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在代码隐藏中注册您的处理函数即

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        ScriptManager.RegisterOnSubmitStatement(Page, Page.GetType(), 
                                                "myHandlerKey", "myhandler()");
    }
    
    Run Code Online (Sandbox Code Playgroud)

就这样!myhandler()将从直接的按钮输入提交和自动__doPostBack()呼叫中调用.