【问题标题】:Second time click of a button inside updatePanel, the event does not fire in jQuery第二次单击 updatePanel 中的按钮,事件不会在 jQuery 中触发
【发布时间】:2010-08-06 14:55:17
【问题描述】:

在我的 aspx 文件中,我有:

<asp:UpdatePanel ID="UpdatePanel3" UpdateMode="Always" runat="server">
    <ContentTemplate>
       <asp:Button ID="Button1" runat="server" Text="Button" />
    </ContentTemplate>
</asp:UpdatePanel>

在我的 JavaScript 文件中:

$('#ctl00_ContentPlaceHolder1_Button1').click(function (e) {
        alert('hello');
    });

但只有第一次点击按钮,我得到了alert('hello'),之后就没有更多的警报消息了。

【问题讨论】:

    标签: jquery asp.net-ajax updatepanel autopostback


    【解决方案1】:

    对于动态内容,使用 jQuery 的.live() 方法。

    $('#ctl00_ContentPlaceHolder1_Button1').live('click', function (e) {
        alert('hello');
    });
    

    另外,我建议使用类而不是 ID。对于影响 ASP.NET 容器/控件结构的任何代码更改,使用 ID 都是脆弱的:

    <asp:Button ID="Button1" runat="server" Text="Button" class="performsMyClickAction" />
    
    $('.performsMyClickAction').live('click', function (e) { ... }
    

    【讨论】:

    • 谢谢,因为我正在使用具有相同类 css 的多个 div,并且我需要为某个 div 做一些事件,因此我使用它的 ID 调用 div。也感谢您的建议!
    • 我没有在 WebForms 项目中过度使用 class 属性,而是使用 End-Of 选择器来仅考虑 ID 的结尾。在这种情况下,选择器将是:$('input[id$=Button1]').live(),其中美元等于组合匹配属性 id 的 End-Of。这样它就会忽略烦人的长前缀。
    • 我收到一个错误并显示以下错误:0x800a01b6 - Microsoft JScript runtime error: Object doesn't support this property or method。我的问题:stackoverflow.com/questions/25431269/…
    【解决方案2】:

    我想知道为什么你的选择器是 #ct_100_ContenPlaceHolder1_Button1。我将它切换到#Button1,它似乎对我来说工作正常。

    【讨论】:

    • 因为您没有将它放在 PLaceHolder 中。它第一次工作正常,但第二次,它没有触发:(
    【解决方案3】:

    UpdatePanel 进行异步回调时,您将丢失 jquery 事件注册,因为面板的内容被完全替换。

    您可以通过在回调期间向脚本管理器添加脚本注册来执行更多 JavaScript 以重新连接。这样的事情应该让你关闭(在你的按钮的服务器端点击处理程序中):

    ScriptManager.RegisterStartupScript(
        this,
        GetType(),
        "AnyStringYouWant",
        "$('#ctl00_ContentPlaceHolder1_Button1').click(function (e) {alert('hello');});",
        true);
    

    【讨论】:

    • 听起来很有趣!你能告诉我我应该把它放在哪里吗?
    • 看起来您已经有了答案,但为了回应您的评论,您可以在代码隐藏中使用此代码,可能在页面生命周期的渲染阶段之前的任何地方。 OnLoad 应该没问题。
    • 是的,这也很好,但我更喜欢在 jQuery 中使用“live”作为上面的答案。它超级有效!谢谢!
    • 在我的情况下我将如何解决它:stackoverflow.com/questions/25431269/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多