最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript - Wait a function to finish - Stack Overflow

programmeradmin4浏览0评论

I need to implement a confirm box replacement by using jquery dialog. I have a calling function like this

function callingFunc() {

 var a = confirmJquery("text", 300, 300, "ok", "cancel"); 

 if (a == true) {
   .....
 }
 else {
   .... 
 }
}

This is the confirmJquery function

function confirmJquery(msg, width, height, txtOk, txtCancel) {

    var div = document.createElement('div');
    div.className = "confirmJquery";

    var span = document.createElement('span');
    $(span).html(msg);
    div.appendChild(span);

    var buttonOk = document.createElement('button');
    buttonOk.className = 'buttonStyleBigger';
    $(buttonOk).html(txtOk);

    var buttonCancel = document.createElement('button');
    buttonCancel.className = 'buttonStyleBigger';
    $(buttonCancel).html(txtCancel);

    var divBottom = document.createElement('div');
    divBottom.className = 'dialogAction';

    divBottom.appendChild(buttonOk);
    divBottom.appendChild(buttonCancel);

    div.appendChild(divBottom);

    var dialog = window.parent.$(div).appendTo(window.parent.document.body);

     // open the dialog
    dialog.dialog({
        height: height,
        width: width,
        resizable: false,
        // add a close listener to prevent adding multiple divs to the document
        close: function(event, ui) {
            // remove div with all data and events
            dialog.remove();
        },
        modal: true
    });

    $(buttonOk).bind('click', function(){
        return true;

    });

    $(buttonCancel).bind('click', function() {

        return false;
    });

}

The problem is, the confirmJquery function always finish before the button (Ok or Cancel) is pressed; hence, there is no value in the calling function. I need to make the confirmJquery waits until user press the button and then function finish and the rest of the calling function continues. How can i do that ?

I need to update more details: I already tried the call back function way. It works perfectly. But, life is not easy like that. This is a very big, old, messy system. Doing that requires me to re-write lot lot of functions, so i need to create a function that act exactly like the confirm function of javascript

I need to implement a confirm box replacement by using jquery dialog. I have a calling function like this

function callingFunc() {

 var a = confirmJquery("text", 300, 300, "ok", "cancel"); 

 if (a == true) {
   .....
 }
 else {
   .... 
 }
}

This is the confirmJquery function

function confirmJquery(msg, width, height, txtOk, txtCancel) {

    var div = document.createElement('div');
    div.className = "confirmJquery";

    var span = document.createElement('span');
    $(span).html(msg);
    div.appendChild(span);

    var buttonOk = document.createElement('button');
    buttonOk.className = 'buttonStyleBigger';
    $(buttonOk).html(txtOk);

    var buttonCancel = document.createElement('button');
    buttonCancel.className = 'buttonStyleBigger';
    $(buttonCancel).html(txtCancel);

    var divBottom = document.createElement('div');
    divBottom.className = 'dialogAction';

    divBottom.appendChild(buttonOk);
    divBottom.appendChild(buttonCancel);

    div.appendChild(divBottom);

    var dialog = window.parent.$(div).appendTo(window.parent.document.body);

     // open the dialog
    dialog.dialog({
        height: height,
        width: width,
        resizable: false,
        // add a close listener to prevent adding multiple divs to the document
        close: function(event, ui) {
            // remove div with all data and events
            dialog.remove();
        },
        modal: true
    });

    $(buttonOk).bind('click', function(){
        return true;

    });

    $(buttonCancel).bind('click', function() {

        return false;
    });

}

The problem is, the confirmJquery function always finish before the button (Ok or Cancel) is pressed; hence, there is no value in the calling function. I need to make the confirmJquery waits until user press the button and then function finish and the rest of the calling function continues. How can i do that ?

I need to update more details: I already tried the call back function way. It works perfectly. But, life is not easy like that. This is a very big, old, messy system. Doing that requires me to re-write lot lot of functions, so i need to create a function that act exactly like the confirm function of javascript

Share Improve this question edited Apr 25, 2012 at 8:07 Thai Tran asked Apr 25, 2012 at 7:58 Thai TranThai Tran 9,9357 gold badges46 silver badges66 bronze badges 1
  • 2 JavaScript is not supposed to wait. – Lucero Commented Apr 25, 2012 at 8:22
Add a ment  | 

4 Answers 4

Reset to default 3

Since your function is going to be asynchronous, you need to use a callback. Something like this:

function myCallback(result)
{
  if (result) {
    // OK
  } else {
    // Cancel
  }
}

function confirmJquery(msg, width, height, txtOk, txtCancel, callback) {
...
    $(buttonOk).bind('click', function(){
        callback(true);
    });

    $(buttonCancel).bind('click', function() {
        callback(false);
    });
}

and

confirmJquery(msg, width, height, txtOk, txtCancel, myCallback);

Move the rest of the function inside another function, and execute that second function at the end of the confirmJquery function.

function firstfunction(){

  // Do Some Stuff

  secondfunction();

}

first, to avoid a long list of arguments on the receiving side, you can use an object of arguments instead. then send over a callback to confirmJquery

function callingFunc() {

    var a = confirmJquery({
        msg:"text", 
        width:300, 
        height:300, 
        txtOk:"ok", 
        txtCancel:"cancel"
    },function(ok){
        if(ok){
            ...
        } else {
            ...
        }
    });
}

function confirmJquery(options,callback) {
    //options.msg
    //options.width
    ...

    $(buttonOk).bind('click', function(){
        callback(true);
    });

    $(buttonCancel).bind('click', function() {
        callback(false);
    });

}

yes, alexander is right, just reorganize code, one for dialog, one for function based on a flag/msg. just like mvc pattern.

发布评论

评论列表(0)

  1. 暂无评论