Asp.net Page_load触发两次UpdatePanel刷新,同时在下拉列表中有一个jQuery绑定的更改事件

Asp.net Page_load触发两次UpdatePanel刷新,同时在下拉列表中有一个jQuery绑定的更改事件,asp.net,jquery,ajax,Asp.net,Jquery,Ajax,我试图用下面一个完整的例子来总结我的问题——最初的问题是我正在编写的jQuery插件的一部分,该插件是为了扩展我已经拥有的ASP.NET ajax应用程序的行为 下面的aspx页面有一个下拉列表,标记为自动回发。我还使用jquery绑定了一个更改事件,最终我将交换一个.live事件,以在更新面板刷新后维护绑定。问题是,当jQuery事件绑定时,我看到两个ajax begin请求和页面加载触发,但只有一个ddlTest\u OnselectedIndexChanged事件。其中一个页面加载的格式也

我试图用下面一个完整的例子来总结我的问题——最初的问题是我正在编写的jQuery插件的一部分,该插件是为了扩展我已经拥有的ASP.NET ajax应用程序的行为

下面的aspx页面有一个下拉列表,标记为自动回发。我还使用jquery绑定了一个更改事件,最终我将交换一个.live事件,以在更新面板刷新后维护绑定。问题是,当jQuery事件绑定时,我看到两个ajax begin请求和页面加载触发,但只有一个ddlTest\u OnselectedIndexChanged事件。其中一个页面加载的格式也不正确-内容长度表示大约300字节长,而totalBytes为0,表单数据为空。如果绑定到按钮的单击事件,则不会发生这种情况

有人能解释一下为什么错误的页面加载事件被触发吗

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Diagnostics" %>
<!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">
    <script runat="server">
      private void Page_Load(object sender, EventArgs e)
      {
          Debug.WriteLine(Request.Headers["Content-Length"]);
          Debug.WriteLine(Request.TotalBytes);
          Debug.WriteLine(Request.Form.ToString());
          Debugger.Break();
      }
      private void ddlTest_OnSelectedIndexChanged(object sender, EventArgs e)
      {
          Debugger.Break();
      }
    </script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function() {
            Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequestHandler);
            $("#<%=ddlTest.ClientID%>").change(function() { alert('jQuery binding fired'); });
        });
        function beginRequestHandler() {
            alert("Started ajax call");
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="SciptManager" runat="server" />
        <asp:UpdatePanel ID="updTest" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlTest_OnSelectedIndexChanged" >
                    <asp:ListItem>First</asp:ListItem>
                    <asp:ListItem>Second</asp:ListItem>
                </asp:DropDownList>
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>
更新:我已经进一步缩小了问题的范围。当IE出现问题时,Firefox和Chrome都能正常工作。我还将错误代码简化为下面的示例。很难相信这么简单,但是下拉列表中的jQuery.change方法会触发select元素上的onchange事件两次!我会寻找其他有这个问题的人,并报告我的发现

<%@ Page Language="C#" AutoEventWireup="true"%>
<!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">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function() {
            $('#ddlTest').change(function() { alert('jQuery event fired'); });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:DropDownList id="ddlTest" runat="server" onchange="alert('element event');">
            <asp:ListItem Text="First" />
            <asp:ListItem Text="Second" />
        </asp:DropDownList>
    </form>
</body>
</html>

调用$.change。。。可能会触发您的下拉列表,并且由于您的自动回发,您的页面会再次刷新。

看起来我在最新版本的jQuery中发现了一个bug:。如果我把测试改回1.3.2版,它就可以正常工作了!我还发现了一个对jQuery引发的问题的引用。

去掉autopostback=true=它正在触发一个回发,而更改事件是另一个。

我已经为我的问题添加了一个更新-我相信你是对的,但我想知道我是否做错了什么,或者可以做些不同的事情来避免IE中的双重触发?@Phil不确定我有权:。在javascript中,函数集同时调用函数。所以它只需要一些测试,看看是否是这种情况。