How to make code wait for okay/cancel button selection?
I am using JQuery's $.dialog()
, where I open a dialog with OK and Cancel buttons.
I would have expected that when the dialog opens, the code stops, and would first continue, when the user had selected OK or Cancel.
Here is my complete source code http://pastebin.com/uw7bvtn7
The section where I have the problem is at line 127-151.
$("#dialog:ui-dialog").di开发者_Go百科alog("destroy");
$("#dialog-confirm").dialog({
resizable: false,
height: 600,
modal: true,
open: function() {
$(this).children('div.dialog-text').replaceWith("<h3><b>Users</b></h3>" + makeDialogTable(users) + "<h3><b>Owners</b></h3>" + makeDialogTable(owners));
},
buttons: {
"Okay": function() {
$(this).dialog("close");
},
Cancel: function() {
is_okay = 0;
$(this).dialog("close");
}
} // buttons
}); // dialog
alert(is_okay);
What the code does right now is to first show the dialog and then the alert(is_okay)
on top.
What I would like is that the code first continues when the user have pressed OK or Cancel.
How could that be done?
You can put your additional code in the "Okay" and "Cancel" button functions. For example:
"Okay": function() {
$(this).dialog("close");
alert(is_okay);
},
That can't be done in a "good" manner plus I strongly recommend not to go that way.
What you describe is a complete blocking, modal window/dialog which is just aweful for web applications. You're already creating the dialog with the modal
flag, so a user can't really do anything on your site while the dialog is open, BUT the UI keeps responsive.
Again, there is actually no way to "hold" code execution. Any approach in that direction would freeze the UI thread since Javascript and UI updates share the same thread.
Since quite a few years, developers pushed Javascript to be more and more non-blocking (Javascript in browsers actually always followed that route, which is very good thing). The idea was reborn with nodeJS on the backend. So, you're swimming upstream here, don't do it.
Whatever the problem is you try to solve there, try to think in different way. Think functional, use callbacks and events, think... ECMAscript! :p
The code does execute sequentially. The job of $("#dialog-confirm").dialog()
is to popup a dialog box. alert(is_okay)
won't execute until the lines above it have been executed. But Okay
and Cancel
are event listeners.
"Okay": function() {
$(this).dialog("close");
}
The code above assigns event listeners to events. That's all it does, it does not execute those functions, it just assigns those functions to event calls.
I would recommend doing some reading on events and event listeners. If you plan on using JQuery seriously, it will save you a lot of confusion.
$("#dialog-confirm").dialog({ ...
close :(event, ui) { alert(is_okay);}
})
Or you can bind function later :
$( "#dialog-confirm" ).bind( "dialogclose", function(event, ui) {
alert(is_okay);
});
The code doesn't stop and continue like it does with alert
, but it will display message only when dialog is closed.
Simply put all code that follows after opening the dialog in a function and call that function from the dialogs callback function for okay / cancel.
function doTheRest(args) {
alert(args);
}
// snippet from dialog options
"Okay": function() {
$(this).dialog("close");
doTheRest(1);
},
"Cancel": function() {
$(this).dialog("close");
doTheRest(0);
}
Browsers use an event-based, asynchronous programming model where many things can (and do) occur at the same time. This is how style-transitions (animations like rolldown or fade) work.
Your example displays a dialog and then throws an alert. It cannot "wait" for the user to click on a button because doing so would stop the browser from doing anything else.
So you'll need to refactor your code to do whatever you require to happen when either the OK or Cancel buttons are clicked within the callback associated with the action.
In other words, you need to:
buttons: {
"Okay": function() { // this function is called when a user clicks the Okay button
// do whatever work is required here
}
}
There is no direct way to "wait" for something in JavaScript -- asynchronous events are generally handled through callbacks. This means you need to think of your program in terms of events and not as sequential code. Instead of your current code:
$("#dialog-confirm").dialog({
...
});
alert(is_okay);
// rest of code
you need to wrap the "rest of code" section into its own function, then call that from the OK/Cancel callbacks of your dialog:
$("#dialog-confirm").dialog({
...
buttons: {
"Okay": function() {
$(this).dialog("close");
what_happens_if_okay();
},
Cancel: function() {
$(this).dialog("close");
what_happens_if_not_okay();
}
} // buttons
}); // dialog
So if I understand correctly you want an alert
to show up with the options OK and Cancel and the Dialog
would not come up unless OK was hit.
Instead of using another alert
why not try using another dialog
with Ok and Cancel in it?
In your html do this:
<div id = "hiddenDialogElements">
<button id = "Ok" onclick = "confirm(true)">OK</button>
<button id = "Cancel" onclick = "confirm(false)">Cancel</button>
</div>
With this css:
#hiddenDialogElements
{
display: none;
}
Then you can do this on the event that will create the dialog
(Where you want a wait):
$('#hiddenDialogElements').dialog({
//Code
});
And this:
function confirm(ifOk)
{
if(ifOk)
{
//Create Dialog
}else {
//Do nothing
}
}
Do Something Like this ...
function MyAlert(Message, Title,FuncExecAfterOkPressed) {
$("<div>" + Message + "</div>").dialog({
title: Title,
dialogClass: "alert",
width: "auto",
modal:true,
open: function (event, ui) { $(".ui-dialog-titlebar-close").hide(); },
buttons: [
{
text: "Ok", click: function () {
$(this).dialog("close");
if (FuncExecAfterOkPressed != null) {
$.Callbacks().add(FuncExecAfterOkPressed).fire(null);
}
}
}]
});
}
Now Call it like this
MyAlert(data, "Duplicate", function () {
alert("I m moumit");
$("#Name").val("");
});
One thing u need is JQueryUI plugin... Enjoy.
精彩评论