【问题标题】:Replace javascript confirm by jquery confirm用jquery确认替换javascript确认
【发布时间】:2013-10-15 06:20:40
【问题描述】:

我使用以下代码通过 jquery ui 对话使用默认 javascript 确认。

jQuery.extend({
    confirm: function(message, title, okAction) {
        jQuery("<div></div>").dialog({
            // Remove the closing 'X' from the dialog
            open: function(event, ui) { jQuery(".ui-dialog-titlebar-close").hide(); }, 
            buttons: {
                "Ok": function() {
                    jQuery(this).dialog("close");
                    return true;
                },
                "Cancel": function() {
                    jQuery(this).dialog("close");
                    return false;
                }
            },
            close: function(event, ui) { jQuery(this).remove(); },
            resizable: false,
            title: title,
            modal: true
        }).text(message);
    }
});

jQuery.confirm(
        "LogOut",
        "Do you want to log out",
        function() { 
        });

现在我需要在注销操作中使用相同的代码。这样我就可以替换代码中的javascript确认了。

<a class="homeImage" onclick="return confirm('Do you want to logout?');" href="/future/myhome/head?$event=logout">LOG OUT</a>

我现在面临的问题是,当我用另一个函数替换确认并等待其返回值做出决定时,对话框不会将值返回给变量。这两个函数同时执行(它显示警报,但它也被定向到 href 目标)。有什么方法可以让该方法返回一个真值或假值,从而继续到 href 目标。

参考:jQuery Extend,jQuery UI Replacement for alert
相关问题:js override confirm

【问题讨论】:

  • 问题是 jQuery.confirm() 没有返回任何东西。这是按钮功能。
  • 我知道,所以我在“确定”和“取消”按钮中有一个返回真假,仍然无法正常工作。那么我如何修改我的代码以返回这些。这是我的问题,你能帮忙吗?

标签: javascript jquery jquery-ui


【解决方案1】:

我不知道你是否真的可以这样做,因为 jQuery.dialog 函数是异步的。

您可以使用承诺库来设置按钮单击事件。但是你不能简单地在onclick属性中指定一个方法,而必须通过代码来完成

var d = jQuery.Deferred();
d.resolve(true); // resolve is used then to mark the function as complete
return d.promise(); // return the promise

jsFiddle

jQuery.extend({
    confirm: function(message, title, okAction) {
        var d = jQuery.Deferred();
        jQuery("<div></div>").dialog({
            // Remove the closing 'X' from the dialog
            open: function(event, ui) { jQuery(".ui-dialog-titlebar-close").hide(); }, 
            buttons: {
                "Ok": function() {
                    jQuery(this).dialog("close");
                    d.resolve(true);
                    return true;
                },
                "Cancel": function() {
                    jQuery(this).dialog("close");
                    d.resolve(false);
                    return false;
                }
            },
            close: function(event, ui) { jQuery(this).remove(); },
            resizable: false,
            title: title,
            modal: true
        }).text(message);
        return d.promise();
    }
});

有关 jQuery Promise 库的更多信息,请参阅jQuery reference



编辑:另一种设置方式:jsFiddle

【讨论】:

    【解决方案2】:

    问题是默认的confirm 对话框是同步的并且阻塞了整个浏览器用户界面。 JQuery 对话框是异步的,不会阻塞 UI(因为它需要它来呈现)。

    因此,您的问题的答案如下。你需要改变:

             buttons: {
                "Ok": function() {
                    window.location = "/future/myhome/head?$event=logout"
                },
    

     <a class="homeImage" onclick="return jQuery.confirm('Do you want to logout?');return false;" href="/future/myhome/head?$event=logout">LOG OUT</a>
    

    【讨论】:

      【解决方案3】:

      就个人而言,我更多地使用确认来执行函数或发布表单...

      因此,使用您的示例,我会进行以下小改动:

      buttons: {
               "Ok": function() {
                    jQuery(this).dialog("close");
                    okAction();  
               },
      

      然后调用Confirm如下:

      onclick="jQuery.confirm('Do you want to logout?','Confirm:',function(){window.location='/future/myhome/head?$event=logout'}); return false;">LOG OUT</a>
      

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多