【问题标题】:jQuery modal dialog does not stop for user inputjQuery 模态对话框不会停止用户输入
【发布时间】:2012-02-10 13:14:32
【问题描述】:

我是 jQuery 新手,但已经使用 jqueryUI 对话框小部件成功实现了几个模式对话框。在尝试实现另一个时,模态对话框打开,但代码继续执行而不停止用户输入。使用 jQuery 1.7.1 和 jquery-ui-1.8.16。

这里是对话框“原型”的定义(它是“原型”,因为它不采取满足要求所需的“确定”选择操作):

var $confirm = $('#confirm');
$confirm.dialog(
{
    autoOpen:false,
    width:440,
    modal:true,
    buttons:
    {
        OK: function()
        {
            $( this ).dialog( 'close' );
        },
        Cancel: function()
        {
            $( this ).dialog( 'close' );
        }
    }
});

下面是一些打开对话框的测试代码:

[ some javascript that does error checking]
alert('stop1');
$('#confirm').dialog('open');
alert('stop2');
[ more javascript including submitting the form]

会发生第一个警报显示。单击它后,对话框与第二个警报一起打开,表明该对话框不等待用户输入。第二个警报是模态的,阻止访问对话框。当它被点击时,表单提交。这个序列表明对话框没有等待用户输入。

我已经查看并查看了其他成功实现的模式对话框,但没有看到可能导致此对话框失败的原因。

【问题讨论】:

标签: javascript jquery modal-dialog jquery-ui-dialog


【解决方案1】:

对话框不会等待。相反,你会想以此为点来决定你想要发生什么。因此,不要在对话框模式之后包含您可能希望或可能不希望运行的其他代码,而是让它成为函数的最后一部分。

然后,使用您的 OK 或 Cancel 函数,在那里调用以继续工作流程(如果他们选择了 ok),或者只是隐藏并执行取消操作需要执行的任何取消操作。

简而言之,模态对话框不会暂停 javascript 的执行,它只会运行代码以打开模态并继续运行。

【讨论】:

  • 我应该补充一点,我的目标只是用一个漂亮的 jQuery UI 模式确认替换一个 javascript 警报。也许问题是由于试图将以前实现的纯 javascript 与 jQuery 模态对话框混合在一起。我理解您关于将代码放在 OK 和 Cancel 函数中的观点。但在我看来,在这种情况下,“模态”对于所有 javascript 来说都不是模态的,而只是对于 jquery javascript,这似乎是模态所暗示的。
  • 另一种说法我上面所说的可能是作为一个经验法则“不要将 html 中的 onclick 与 jQuery 函数混合使用。要么通过 onclick 执行所有操作,要么通过 jQuery 执行所有操作。这是一个有效观察?
【解决方案2】:

你应该使用一个承诺:

function deferredConfirm(message) {

$('<div></div>').html(message).dialog({
    dialogClass: 'confirmDialog',
    buttons:
    [{
        text: buttonText,
        click: function () {
            $(this).dialog("close");
            defer.resolve();
        }
    },
    {
        text: buttonText2,
        click: function () {
            $(this).dialog("close");
            defer.reject();
        }
    }],
    close: function () {
        $(this).remove();
    }
});

    return defer.promise();
}

并称它为:

            deferredConfirm("Oh No!").then(function() {
               //do something if dialog confirmed
            });

【讨论】:

  • 这看起来是一个非常有趣的方法。然而,正如人们可能猜到的那样,由于最初的问题现在已经超过 7 年了,我们早就开发了自己的方法来处理这个要求。然而,这个答案的方法可能更简单,并且可以在重新设计时重新审视。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多