【问题标题】:how to prevent a jquery ui dialog to close on hitting enter如何防止 jquery ui 对话框在按 Enter 时关闭
【发布时间】:2011-05-13 14:07:19
【问题描述】:

我的 HTML 定义如下:

忘记密码

<div id='dialog-form-lostpass' title='password recovery' class='hidden lsdialog'>
    <p id='explain'>Please enter your username or email address. We will then immediately mail your
        password to your registered email address</p>
    <p id='progress'></p>
    <form>
        <fieldset>
            <label for='username'>username or email</label><br />
            <input type='text' name='username' id='username' class='text ui-widget-content ui-corner-all' /><br />
        </fieldset>
    </form>
</div>

脚本:

 $(document).ready(function() {
    $(":button#forgotpassword").click(function() { //* open dialog to retreive user's password
        $("#dialog-form-lostpass").find("p[id=progress]").text(null); //* reset progress
        $("#dialog-form-lostpass").dialog("open");
        return false;
    });

    $("#dialog-form-lostpass").dialog({
        autoOpen: false,
        modal: true,
        buttons: {
            "mail password": function() {
                $("#dialog-form-lostpass").find("p[id=progress]").html("<img src='images/wait.gif' height=10>Contacting Linkshelf Server...");

                $.post(options.engine, {
                    command: "retreivepassword",
                    username: $("#dialog-form-lostpass").find("input[id=username]").val(),
                }, function(data) {
                    if (data.success) {
                        $("#dialog-form-lostpass").dialog("close");
                        $("#loginscreen").find("p[id=progress]").text("Your password is sent to your registered email address. You should receive an email from us soon. Make sure there is no spam-filter blocking our email.").addClass("ui-state-error").removeClass("ui-state-error", 1700);
                    } else {
                        if (data.feedback == "invalid entry") {
                            $("dialog-form-lostpass").find("p[id=progress]").text("Invalid entry. You didn't provide us with enough information to retreive your password").addClass("ui-state-error").removeClass("ui-state-error", 1700);
                        } else {
                            $("#dialog-form-lostpass").find("p[id=progress]").text("Unknown username and/or email address. We can not retreive your password").addClass("ui-state-error").removeClass("ui-state-error", 1700);
                        }
                    }
                }, "json");
            }
        },
    });

});

现在,当我点击“忘记密码”按钮时,我会看到对话框(在 this fiddle 上查看,布局看起来很糟糕,但你会明白的)。当我点击 ESC 我回到初始屏幕,当我点击“邮件密码”时没有意外发生,但是当我点击“输入”到浏览器加载不同的位置时,好像执行了表单的默认操作。

在小提琴中很难看到,但在我的网站中,人们被转发到 ./?username=,这告诉我这是初始屏幕中表单中不受欢迎的行为。我怎样才能防止这种情况发生?

【问题讨论】:

  • 恐怕比这复杂一点。如果您检查小提琴并在初始表单上点击“输入”,则没有重定向行为。此外,当我在对话框上单击“关闭”时,什么也没有发生。但是当我在对话框中按回车键时,我会重定向到 ./?username。必须有一些比阻止“进入”更优雅的解决方案。我确实希望人们能够在对话框中使用“输入”,就像他们习惯的那样......

标签: jquery jquery-ui forms dialog


【解决方案1】:

在对话框中添加一个id:

<form id="passwordform">
        <fieldset>
            <label for='username'>username or email</label><br />
            <input type='text' name='username' id='username' class='text ui-widget-content ui-corner-all' /><br />
        </fieldset>
    </form>

然后告诉 jQuery 阻止它提交,因为对话框会这样做:

$('#passwordform').submit( function(e) {
     e.preventDefault();
});

【讨论】:

  • 但我确实希望人们能够使用默认设置。问题在于有两种嵌套形式。我尝试给他们不同的ID,但这不起作用。我想我会在打开对话框时禁用第一个表单的默认设置,并在关闭对话框时重新启用它...
  • 我将此用作解决方法。有趣的是,有了 ID,我需要阻止对话框的默认操作,以防止初始表单中的默认操作。不知何故,我确实觉得这是嵌套表单的问题,即使它们具有唯一的 ID。不知道这是一个常见问题还是 jQuery-UI 特有的问题......
  • 由于对话框在您需要它之前是隐藏的,因此请尝试在初始表单之外定义它。看起来您不需要一起提交任何元素,因此它不应该影响您的功能。没错,嵌套表单通常不是一个好主意。
【解决方案2】:

您的对话框正在关闭,因为当输入时表单正在提交,因此重新刷新页面。要停止这种情况,您可以添加类似的内容。

$('form').submit(function(e){
    return false;
});

【讨论】:

  • 但是关闭对话框会触发底层表单的提交,这有点奇怪,不是吗?可能是嵌套表单的问题吗?
  • 是的,就是这样!嵌套形式是问题所在。我将尝试添加一些 ID(在 jQuery-UI 文档中,表单中没有 ID)。但这就是解决方案......我从对话框中删除了表单,它不再发生......
  • 简而言之:按回车键触发了第一个表单上的提交,而不是它应该触发的对话框
【解决方案3】:

首先,您需要在表单中有一个提交按钮,否则按 Enter 不会提交(您可以放置​​一个隐藏的提交按钮 - 应该也可以)。

然后您可以输入onsubmit="jsProcessFunctionHere(); return false"

这样按回车键将触发您的密码重置过程,而不是关闭对话框。

【讨论】:

    【解决方案4】:

    我的解决方法是在主按钮之前放置一个隐藏按钮,似乎第一个按钮是默认按钮。所以像这样添加你的按钮;只需确保您有一个具有 display:none; 的 .hide 类;

            buttons: {
    
                "Hiden": { text: "", class:"hide", click: function () {
                    return false;
                }},
                "Process": { class: "btn btn-primary", text: "OK", click: function () {
                    alert('process');
                }
                },
                Cancel: { class: "btn", text: "Cancel", click: function () {
                    $(this).dialog("close");
                }}
            }
    

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2012-05-06
      • 2022-01-06
      • 2012-02-18
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多