jquery ui dialog box need to return value, when user presses button, but not working

前端 未结 5 1213
面向向阳花
面向向阳花 2020-11-29 09:32

I\'v got a jquery ui dialog box I want to use to prompt the user to confirm a deletion. When the user presses \"yes\" or \"no\" I need to return \"True\" or \"False\" to co

相关标签:
5条回答
  • 2020-11-29 09:45

    You need to use callback functions. Here is the working example:

    Following is the fa-icon. When user clicks it it calls javascript.

      <a href="#" id="removeNode"><i class="fa fa-minus-circle fa-lg"></i></a>
    

    Following is the javascript code executed when user click "Remove Node" fa icon.

    $("a#removeNode").click(function(){
      // returns the attribute of "selected" Table Row either it is expanded or collapsed based on it's class 
      var datattid = $("tr.expanded.selected, tr.collapsed.selected").attr("data-tt-id"); 
      //alert($("tr.expanded.selected").attr("data-tt-id"));  
      if(typeof datattid != 'undefined'){
        //alert(datattid);
        displayConfirmDialog("You are trying to remove selected node : " + datattid + ". Are you sure?", proceedToRemoveNode);
      }else 
      {
        showErrorDialog("Invalid Row Selection", "Node is not selected.\n You must select the node to remove it." );
      //  displayMessage ("#dialog-message", "Invalid Row Selection", "ui-icon-heart",  "Node is not selected.\n You must select the node to remove it." );  
      }
    });
    

    The displayConfirmDialog displays the confirmation message and based on use action it calls the callback function. Here is the code of displayConfirmDialog.

    //Confirmation dialog to remove node
    function displayConfirmDialog(message, proceedWithRequest)
    {
        var retVal;
    
        $("div#dialog-confirm").find("p").html(message);
    
        var confirmDlg = $( "#dialog-confirm" ).dialog({
              resizable: false,
              height: "auto",
              width: 400,
              modal: true,
              buttons: {
              "Remove Node": function() {
                this.retVal = true;
                proceedWithRequest()  
                $( this ).dialog( "close" );
              },
              Cancel: function() {
                this.retVal = false;
                $( this ).dialog( "close" );
              }
            },
            show:{effect:'scale', duration: 700},
            hide:{effect:'explode', duration: 700}  
        });
    
        confirmDlg.dialog("open");  
    }
    

    Following is the callback function:

    //Callback function called if user  confirms to remove node.
    function proceedToRemoveNode()
    {
      var datattid = $("tr.expanded.selected, tr.collapsed.selected").attr("data-tt-id"); 
      $("#nh_table").treetable("removeNode", datattid);
      showErrorDialog("Node removed successfully", "The node " + datattid + " is removed successfully" );
    //  alert("The node " + datattid + " is removed successfully");
    }
    

    Following is images of working application that deletes node from a TreeTable using JQuery.

    After confirmation the node "qa-2" is removed from the Tree as shown in following image.

    0 讨论(0)
  • 2020-11-29 09:53
    function confirm() {
            $("#dialog-message").dialog({
                    modal : true,
                    buttons: {
                        "Yes" : function() {
                            $(this).dialog("close");
                            document.forms[0].action = "actionname-yes";
    
                            document.forms[0].submit();                         
                        },
                        "No" : function() {
                                $(this).dialog("close");
                                document.forms[0].action = "actionname-no";
                                document.forms[0].submit();
                        }       
                    }
            });
    
    0 讨论(0)
  • 2020-11-29 09:59

    U should see this answer.

    Well, This can work.

    Your dialog function... showDialog()

    function confirmation(question) {
        var defer = $.Deferred();
        $('<div></div>')
            .html(question)
            .dialog({
                autoOpen: true,
                modal: true,
                title: 'Confirmation',
                buttons: {
                    "Yes": function () {
                         $(this).dialog("close");
                        defer.resolve("true");//this text 'true' can be anything. But for this usage, it should be true or false.
    
                    },
                    "No": function () {
                        $(this).dialog("close");
                        defer.resolve("false");//this text 'false' can be anything. But for this usage, it should be true or false.
    
                    }
                },
                close: function () {
                    $(this).remove();
                }
            });
        return defer.promise();
    }
    

    and then the code where you use the function...

    function onclick(){
        var question = "Do you want to start a war?";
        confirmation(question).then(function (answer) {
    
            if(answer=="true"){
                alert("this is obviously " + ansbool);//TRUE
            } else {
                alert("and then there is " + ansbool);//FALSE
            }
        });
    }
    

    This may seem wrong for most people. But there is always some situations where you just can't go without return from JQuery Dialog.

    This will basically mimic the confirm() function. But with ugly code and a nice confirm box look :)

    I hope this helps some people out.

    Honestly,I was take many time for this, finally i found best solution.you can see more detail here=>Awesome Solution

    0 讨论(0)
  • 2020-11-29 10:01

    If anyone needs a graphic demonstration of asynchronous behavior, here's one that might be helpful. Wrap Ronedog's dialog in a function. I've used "showConfirm" below. Capture the return value in a variable. Call it in some button click event, and try to alert what button was pressed:

    $('.btn').on('click', function(event) {
        var cVal = showConfirm('Really?');
        alert('User pressed ' + cVal);  
    });
    

    You will find that you always get the alert before you have a chance to press the button. Since javascript is asynchronous, the alert function doesn't have to wait for the result of the showConfirm function.

    If you then set up the function Neal's way everything will work (thanks Neal).

    0 讨论(0)
  • 2020-11-29 10:05

    javascript is asynchronous.

    so you have to use callbacks:

       $("#modal_confirm_yes_no").dialog({
                bgiframe: true,
                autoOpen: false,
                minHeight: 200,
                width: 350,
                modal: true,
                closeOnEscape: false,
                draggable: false,
                resizable: false,
                buttons: {
                        'Yes': function(){
                            $(this).dialog('close');
                            callback(true);
                        },
                        'No': function(){
                            $(this).dialog('close');
                            callback(false);
                        }
                    }
            });
        function callback(value){
             //do something
        }
    
    0 讨论(0)
提交回复
热议问题