jQuery点击消失在一些深渊中

时间:2010-11-11 19:31:39

标签: asp.net jquery jquery-click-event

这是我的设置:

我在页面上有一个asp.net按钮 -

<asp:Button id="btnSelectEmp" runat="server" Text="Select Employee" />

我有一个带有以下jQuery点击事件的.js文件 -

$("input[id$='_btnSelectEmp']").click(function ($e) {
  $("div[id$='_divEmpSearch']").css("display", "inline");
  $e.preventDefault();
});

如您所见,单击按钮将设置div可见。没什么特别的;不是火箭科学。

div包含一个asp.net更新面板,它包含一个asp.net用户控件(.ascx)

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
  <div id="divEmpSearch" runat="server" style="display: none;">
    <uc:EmpSearch ID="ucEmpSearch" runat="server" />
  </div>
  // And a bunch of other controls that are updated according to whatever the user selects in the user control above
</ContentTemplate>
<Triggers>
  <asp:AsyncPostBackTrigger ControlID="ucEmpSearch" />
</Triggers>
</asp:UpdatePanel>

上面的用户控件也包含在asp.net更新面板中,因为它必须与服务器通信。在诸如文本框之类的其他控件中,用户控件上有两个按钮:1)执行回发的asp.net按钮和2)执行异步回发的asp.net按钮。

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
      <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" /
      <br />
      asp:Button ID="btnContinue" runat="server" Text="Select" OnClick="btnContinue_Click" />
    </ContentTemplate>
    <Triggers>
      <asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" />
      <asp:PostBackTrigger ControlID="btnContinue" />
    </Triggers>
</asp:UpdatePanel>

用户控件中执行回发的按钮效果很好。我点击它,发生回发并重新隐藏我的div控件。然后,我可以单击Select Employee按钮(我在问题的第一个提供代码的那个按钮)并处理jQuery click事件并重新显示div。

但是,执行异步回发的用户控件中的按钮也可以工作,但是在隐藏div后,如果我再单击Select Employee按钮则不会处理jQuery click事件

这告诉我的是,由于某种原因,在异步回发页面期间,“选择员工”按钮会发生某些事情,因此jQuery点击事件不再发生。为什么呢?

4 个答案:

答案 0 :(得分:1)

尝试live('click', function(){...})而不是click(function(){...})

答案 1 :(得分:1)

使用live()功能。 live()将click事件委托给父元素,因此在绑定事件时不需要存在元素(在本例中为btnSelectEmp)。

$("#<%=btnSelectEmp.ClientID%>").live("click" function ($e) {
  $("#<%=divEmpSearch.ClientID%>").css("display", "inline");
  $e.preventDefault();
});

正在发生的事情是btnSelectEmp按钮被异步调用替换,并且新元素尚未绑定到事件处理程序。

另外,我在这里修改了jquery选择器以使用元素的确切客户端ID。这将提高速度,而且我似乎记得某些选择器在某些版本的Jquery中不能使用事件委托。

答案 2 :(得分:1)

当您的更新面板返回新内容时,您的按钮会被替换为新按钮,因此:

$("input[id$='_btnSelectEmp']").click(function ($e) {

绑定到当时找到的元素,而您希望此处.delegate().live()收听来自当前click个事件>和未来的元素,如下:

$("input[id$='_btnSelectEmp']").live("click", function ($e) {
  $("div[id$='_divEmpSearch']").css("display", "inline");
  $e.preventDefault();
});

或使用.delegate()便宜一点:

$("#container").delegate("input[id$='_btnSelectEmp']", "click", function ($e) {
  $("div[id$='_divEmpSearch']").css("display", "inline");
  $e.preventDefault();
});

在这种情况下,#container应该是更新面板的父级,不会在回发中被替换。

答案 3 :(得分:0)

狂野猜测:“_btSeSelectEmp”被多次使用?