7

JQuery を使用して再利用可能な「確認」ダイアログを実装する方法を探しています。

これは、ダイアログを開くための MyApp クラスの一部です。

/**
 * @param text string Message to display
 */
getConfirmationDialog: function(text) {
   MyApp.confirmDialog = $('<div><p>' + text + '</p></div>');
   MyApp.confirmDialog
    .dialog({
        modal: true,
        autoOpen: false,
        title: 'Please confirm',
        width: 300,
        height: 180,
        buttons: {
            'OK': function() {
                return true;
            },
            Cancel: function() {
                $(this).dialog('close');
                return false;
            }
        }
    });

    MyApp.confirmDialog.dialog('open');
},

別のクラスでは、次のことを行います。

/**
 * Clear system cache
 *
 * @param url string Backend URL
 */
clearCache: function(url) {

    dialog = MyApp.getConfirmationDialog('Clear cache?');

    //dialog returns true..
    if (dialog) {
        MyApp.admin.dashboard.doClearCache();
    }

},

しかし、これを「正しい」方法で行う方法がわかりません..ダイアログは値を返すことができませんか?

4

7 に答える 7

5

以下のコードは、この問題に対する私の解決策です。関数内での使用法を文書化しましたが、ここで強調します。

$.ConfirmDialog('Do you want to continue?', 'Continue Title', function() { alert('yes'); }, function() { alert('no'); }, null);

特別な設定は必要ありません。ページに「ConfirmDialog」コードブロックを含めて (私は自分の app.js に入れました)、上記の 1 行で呼び出します。楽しみ!

$.ConfirmDialog = function (message, title, callbackYes, callbackNo, callbackArgument) {
    /// <summary>
    ///     Generic confirmation dialog.
    ///
    ///     Usage:
    ///         $.ConfirmDialog('Do you want to continue?', 'Continue Title', function() { alert('yes'); }, function() { alert('no'); }, null);
    ///         $.ConfirmDialog('Do you want to continue?', 'Continue Title', function(arg) { alert('yes, ' + arg); }, function(arg) { alert('no, ' + arg); }, 'please');
    ///</summary>
    ///<param name="message" type="String">
    ///     The string message to display in the dialog.
    ///</param>
    ///<param name="title" type="String">
    ///     The string title to display in the top bar of the dialog.
    ///</param>
    ///<param name="callbackYes" type="Function">
    ///     The callback function when response is yes.
    ///</param>
    ///<param name="callbackNo" type="Function">
    ///     The callback function when response is no.
    ///</param>
    ///<param name="callbackNo" type="Object">
    ///     Optional parameter that is passed to either callback function.
    ///</param>

    if ($("#modalConfirmDialog").length == 0)
        $('body').append('<div id="modalConfirmDialog"></div>');

    var dlg = $("#modalConfirmDialog")
        .html(message)
        .dialog({
            autoOpen: false, // set this to false so we can manually open it
            dialogClass: "confirmScreenWindow",
            closeOnEscape: true,
            draggable: false,
            width: 460,
            minHeight: 50,
            modal: true,
            resizable: false,
            title: title,
            buttons: {
                Yes: function () {
                    if (callbackYes && typeof (callbackYes) === "function") {
                        if (callbackArgument == null) {
                            callbackYes();
                        } else {
                            callbackYes(callbackArgument);
                        }
                    }

                    $(this).dialog("close");
                },

                No: function () {
                    if (callbackNo && typeof (callbackNo) === "function") {
                        if (callbackArgument == null) {
                            callbackNo();
                        } else {
                            callbackNo(callbackArgument);
                        }
                    }

                    $(this).dialog("close");
                }
            }
        });
    dlg.dialog("open");
};
于 2012-04-03T19:13:54.377 に答える
4

確認ボタンについては、上記のvinayの回答を参照してください。私はそれを再利用して、通常の目的で[OK]ボタンを使用し、確認のために[OK]と[キャンセル]を選択して、シンプルでありながら再利用可能なダイアログを作成しました。カスタムタイトルとコンテンツをその場で設定することもできます。

<div id="yeah" title="Alert">
    <p id="yeah_msg">&nbsp;</p>
</div>

<button id="click_me">Show it</button>

<script type="text/javascript">
    function dlg(msg, callback, title){
        if(callback == undefined){
            callback = null;
        }
        if(title == undefined){
            title = 'Alert';
        }

        $("#yeah_msg").html(msg);
        $("#yeah").dialog('option', 'title', title);

        if(callback){
            $("#yeah").dialog('option', 'buttons', { 
                "Ok": function() { 
                    $( this ).dialog( "close" );
                    if(null != callback) callback.success();
                }, 
                'Cancel': function(){
                    $( this ).dialog( "close" );
                    if(null != callback) callback.fail();
                }  
            });
        }else{
            $("#yeah").dialog('option', 'buttons', { 
                "Ok": function() { 
                    $( this ).dialog( "close" );
                }
            });
        }

        $("#yeah").dialog("open");
    }

    $(document).ready(function(){
        //create dialog
        $("#yeah").dialog({ 
            autoOpen: false, 
            modal: true, 
            show: 'blind', 
            hide: 'explode',
            resizable: false 
        });

        //show dialog   
        $('#click_me').click(function(){
            dlg('title', {success: function(){ console.log('yipee'); }, fail: function(){ console.log('nopee'); } });
        });
    });
</script>
于 2012-10-13T14:41:09.577 に答える
3
  1. 確認クラスを作成します。

    //以下は確認クラスのスケルトンです

       function ConfirmDialog() {
           this.showMessage = function(message, callback, argument) {
    
                var $dialog = $('<div></div>')
                   .html(message)
                   .dialog({
                        modal: true,
                        closeOnEscape: true,
                        buttons: {
                             Yes: function() {
                               if (callback && typeof(callback) === "function") {
                                  if (argument == 'undefined') {
                                      callback();
                                   } else {
                                      callback(argument);
                                    }
                                  }
    
                                 $(this).dialog("close");
                               },
    
                              No: function() {
                                  $(this).dialog("close");
                              }
                          }
                      });
                  $dialog.dialog("open");
                 }
           }
    
  2. タイプconfirmDialogのオブジェクトを作成し、.jspに配置します

    CONFIRM_DIALOG = new ConfirmDialog();
    
  3. 1 つのパラメーターでコールバック メッセージを作成します。

    function saved(what) {
        alert("Saved: " + what);        
    }
    
  4. 必要な場所に呼び出します。

    CONFIRM_DIALOG.showMessage("Do you wish to marry?", saved, "Life");
    

仕事完了!!

于 2011-09-20T15:58:01.587 に答える
3

jQuery UI は、ダイアログ ボタンのイベントを変更する適切な方法を提供しません。

pubsub パターン、Cowboyba の小さな pubsub プラグイン (こちら) または phiggins の取り組み (こちら) を使用します。jquery ui の getter と setter を使用してボタンとそのクリック イベントを変更しようとするよりもクリーンです。大規模なアプリを作成すると、他の多くの場所で役立ちます。

[OK] ボタンをクリックするためにイベントを発行し、他のハンドラーをサブスクライブおよびサブスクライブ解除して、イベントをリッスンすることができます。

機能を示すクイックデモはこちら。

于 2010-12-12T16:39:58.120 に答える
2

私はあなたが言っていることを理解していると思います。私のjsfiddle の試みを見て、それがまったく役立つかどうかを確認してください。私はそれがあなたがしようとしていることをしていると思います。

于 2010-12-12T16:33:08.337 に答える
1

Jquery で確認ボックスを正常に実装しました。これを試す前に、コードに Jquery ライブラリと css が含まれていることを確認してください (jquery-ui-1.8.16.custom.css、jquery-1.6.2.js、jquery-ui-1.8.16.custom.min. js)。JAVASCRIPT CONFIRM ボックスと、DIV を使用して作成したこのボックスの主な違いは、JAVASCRIPT CONFIRM はユーザー入力を待機し、ユーザーが YES/NO を入力した後、次の行が実行されます。ここでは、YES または NO でそれを行う必要があります。ブロック -- ** showConfirm() の後のコードの次の行はすぐに実行されます * 注意してください

/** add this div to your html

*/

var $confirm;
var callBack;
var iconStyle = '<span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 50px 0;"></span>';
var messageStyleStart = '<span align="center" style="font-family:arial, verdana, sans-serif;font-size:9.3pt;">';
var messageStyleEnd = '</span>';


$(document).ready(function(){
    $('#confirmDialog').dialog({
            autoOpen: false,
            modal: true
    });


    //jquery confirm box -- the general alert box
    $confirm = $('<div  style="vertical-align:middle;"></div>')
    .html('This Message will be replaced!')
    .dialog({
        autoOpen: false,
        modal: true,
        position: 'top',
        height:300,
        width: 460,
        modal: true,
        buttons: {
            Ok   : function() {
                $( this ).dialog( "close" );
                if(null != callBack)
                    callBack.success();
            },
            Cancel: function() {
                $( this ).dialog( "close" );
                if(null != callBack)
                    callBack.fail();
            }
        }
    }); 

});

    function showConfirm(message,callBackMe,title){
    callBack = null;
    $confirm.html(""); // work around
    $confirm.html(iconStyle + messageStyleStart +message + messageStyleEnd);
    if(title =='undefined'|| null ==title)
        $confirm.dialog( "option", "title", "Please confirm" );
    else
        $confirm.dialog( "option", "title", title);
    var val = $confirm.dialog('open');
    callBack = callBackMe;
    // prevent the default action
    return true;
}

    // Now for calling the function 
// create a Javascript/jSOn callback object 

var callMeBack = {
                    success: function()
                            {   // call your yes function here                                  
                                clickedYes();
                                return;
                            },
                    fail: function (){
                                // call your 'no' function here
                                 clickedNo();
                                return ;
                            }
                };


    showConfirm("Do you want to Exit ?<br/>"+
                    ,callMeBack1,"Please Answer");
于 2012-01-24T00:04:06.073 に答える
1

Whoa why is this so complex? Here is an easy way

$("#myButton").click(function(event) {
    var cont = confirm('Continue?');
    if(cont) {
        // do stuff here if OK was clicked
        return true;
    }
    // If cancel was clicked button execution will be halted.
    event.preventDefault();
}
于 2012-12-13T21:34:56.870 に答える