【问题标题】:jQuery UI modal confirmation dialog with ASP.NET not firing onClick event带有 ASP.NET 的 jQuery UI 模式确认对话框未触发 onClick 事件
【发布时间】:2026-01-05 10:10:02
【问题描述】:

jQuery 新手在这里。我已经查看了这个网站上的几十个类似问题,以及到目前为止提供的答案,所有答案都几乎相同,我已经尝试了所有这些问题,但没有一个对我有用。

对于我的 .aspx 中的 Javascript 代码,我目前有:

<script type="text/javascript" src="/resources/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="/resources/jquery-ui-1.8.20.custom.min.js"></script>
<link rel="stylesheet" type="text/css" href="/resources/ui-lightness/jquery-ui-1.8.20.custom.css" />

<script language="javascript" type="text/javascript">
    $(function() {
        var $myDialog = $("#cancelDialog").dialog({
            autoOpen: false,
            modal: true,
            buttons: {
                'Yes, cancel': function() {
                    $(this).dialog('close');
                    return true;
                },
                'No, resume editing': function() {
                    $(this).dialog('close');
                    return false;
                }
            }
        });

        $("[id$=btnCancel]").click(function(e) {
            //e.preventDefault();
            alert('boo');
            //$myDialog.dialog('open');
        });
    });
</script>

“btnCancel”的标记看起来像这样 - 请注意我没有“onClientClick”属性,因为 jQuery 应该为我做这件事,对吧?

<asp:Button ID="btnCancel" CssClass="btnCancel" runat="server" Text="Cancel"
    CausesValidation="false" UseSubmitBehavior="false" />

这是取消对话框的标记:

<div id="cancelDialog" style="display: none;" title="Please confirm cancellation">
    <p>Are you sure you wish to cancel and abandon your changes?</p>
</div>

根据我看到的所有示例(以及此处提供的答案),这应该会给我一个 jQuery UI 弹出窗口,其中包含两个可以正常工作的按钮。当我点击取消按钮时,该页面不再发回(由于我在 Patrick Scott 的建议下所做的更改)。我可以为此使用标准的 Javascript 确认()对话框,但我希望能够自定义提示/样式。

我能想到的唯一其他信息是此代码位于 ASP.NET 向导控件上(取消按钮位于 StepNavigationTemplate 中),但这不重要,不是吗?

非常感谢任何有关我需要更改以使其正常工作的提示!

(问题和代码已更新以反映我最近所做的更改)

【问题讨论】:

  • 你确定在浏览器中渲染元素的Id是btnCancel吗?
  • 如果 .net 正在添加一堆东西,请使用 $("[id$=btnCancel]")

标签: javascript jquery asp.net jquery-ui jquery-ui-dialog


【解决方案1】:

它不起作用的原因是按钮的 ID 在呈现到页面时发生了变化。要在 JavaScript 中访问控件,您需要使用 ClientID 属性:

$("#<%= btnCancel.ClientID %>").click(function(e){
    //open the dialog
});

【讨论】:

  • 我对此进行了许多尝试,但始终无法正常工作。我一定有别的问题。我将在那里发出警报,正如 matpol 建议的那样,看看我的 javascript 是否正在运行。
【解决方案2】:

使用 $("[id$=btnCancel]") 作为点击事件的选择器。

$= 表示在 jquery 选择器中以结尾,而 webforms 添加了一堆会让你的 id 不匹配的东西。

$("[id$=btnCancel]").click(function(e) {

我也不明白为什么您将按钮与对话框的其余部分分开声明...

改为这样做:

$(function() {
        var $myDialog = $("#cancelDialog").dialog({
            autoOpen: false,
            modal: true,
            buttons: {
                    'Yes, cancel': function() {
                        $(this).dialog('close');
                        return true;
                    },
                    'No, resume editing': function() {
                        $(this).dialog('close');
                        return false;
                    }
                }
        });

        $("[id$=btnCancel]").click(function(e) {
            e.preventDefault();
            $myDialog.dialog('open');
        });
    });

【讨论】:

  • 或客户 ID,就像 James Johnson 建议的那样。我个人更喜欢这种方式。我想他的故障保险更安全,例如,如果你有“anotherbtnCancel”,它也会匹配并给你一些意想不到的行为。
  • 虽然他的js需要在aspx页面里面定义
  • 这让我离得更近了一点(即表单不再发回),但我仍然没有得到对话。按照您的建议,我将 javascript(作为包含)放在页面的主要内容占位符中,而不是在 标记中。
  • 我又玩了一些,但仍然没有任何进展。我尝试将 javascript 放在它自己的文件中并包含它(在标题和正文中),将它内联在标题和正文中 - 没有任何效果。我确实尝试用 alert() 代替“dialog('open')”调用,但什么也没发生(有任何线索吗?)。我很好奇:取消对话框
    上的“显示”属性如何/何时从“无”更改为“阻止”,以便对话框可见?这是 jQuery-ui 固有的,并且只是在调用“dialog('open')”时自动发生?
  • 您是否包含 jquery-ui.css?对话框打开应该使对话框可见,是的(虽然比将其设置为可见要复杂一些)。如果你检查你的 html(使用 firebug 或类似的东西)你能看到对话框吗?是否有任何 javascript 错误?
【解决方案3】:

您需要将其分解 - 听起来 JS 中存在另一个您看不到的错误,因为该页面正在重新发布。尝试在点击时发出警报:

$('#btnCancel').click(function(e) {
alert('boo');
});

如果这不起作用,您需要制作最简单的脚本以使其正常工作,然后添加到它。

【讨论】:

    【解决方案4】:

    我想通了!事实证明,&lt;script&gt; 标签(似乎也不是大多数其他标签)在 HTML4 或 HTML5 中不能自闭合。我是这样写的:

    <script type="text/javascript" src="whatever" />
    

    根据标准,它们必须这样写:

    <script type="text/javascript" src="whatever"></script>
    

    这允许我的第一个 &lt;script&gt; 包含工作 (jquery-1.7.2.min.js),但随后的失败。很奇怪吧?

    以下是一些支持信息的链接:

    【讨论】:

    • 感谢大家的帮助!我真的很感激!
    • 好吧,我说得太早了。我只是部分想通了。我现在得到了 jQuery-UI 对话框,但是如果用户在对话框中确认取消,我需要触发 ASPX 按钮的服务器端 OnClick 方法。这没有发生,我需要一些帮助。
    • 为了解决这个问题,我最终在 ASPX 表单 (&lt;asp:Button ID="btnHdnCancel" runat="server" Style="display: none;" Text="Cancel" OnClick="btnCancel_Click" /&gt;) 中添加了一个隐藏的取消按钮,然后在 jquery-ui 确认对话框上的“是”按钮中添加了一个 click() 事件像这样:$("[id$='&lt;%= btnHdnCancel.ClientID %&gt;']").click();.
    【解决方案5】:
    <%=this.Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this.Button1))%>;
    

    将它与模式确认对话框上的“是”按钮挂钩。您需要根据需要更改 ID。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签