Как отложить возврат функции до тех пор, пока не будут выполнены щелчки

StackOverflow https://stackoverflow.com/questions/1033759

  •  06-07-2019
  •  | 
  •  

Вопрос

Следующая функция confirmDialog вызывается на полпути через другую функцию jquery.Когда этот confirmDialog возвращает true, предполагается, что другая функция продолжит работу...но это не так.Причина этого, по-видимому, заключается в том, что вся функция confirmDialog уже выполнена (возвращая false) к моменту нажатия кнопки продолжить.Как я могу отложить возврат чего-либо до тех пор, пока не будут нажаты кнопки?

(Или, если я совершенно не на том пути, в чем проблема и как мне ее исправить?)

function confirmDialog(message) {
....
    $('input#continue', conf_dialog).click(function() {
        $(this).unbind();
        $('p',conf_dialog).fadeOut().text('Are you really sure you want to '+message).fadeIn();
        $(this).click(function() {
            $(conf_dialog).remove();
            return true;
        });
    }); 
    $('input#cancel', conf_dialog).click(function() {
        $(conf_dialog).remove();
        return false;
    }); 
}
Это было полезно?

Решение

function callingFunction() {
  $('a').click(function() {
    confirmDialog('are you sure?', dialogConfirmed);
    // the rest of the function is in dialogConfirmed so doesnt 
    // get run unless the confirm button is pressed
  })
}

function dialogConfirmed() {
  // put the rest of your function here
}

function confirmDialog(message, callback) {
  ...
  $('input#continue', conf_dialog).click(function() {
    callback()
    $(conf_dialog).remove();
    return false;
  }),
  $('input#cancel', conf_dialog).click(function() {
    $(conf_dialog).remove();
    return false;
  })
  ...
}

Другие советы

Я не уверен, что ты можешь. Только встроенная функция AFAIK, такая как Подтвердить , alert или prompt , может блокироваться при запросе ответа.

Обходной путь - рефакторинг вашего кода для использования обратных вызовов (или использования встроенных функций). Так что это будет означать разделение вашей вызывающей функции на две части и выполнение второй части при получении ввода.

В verifyDialog вы настраиваете обработчики событий, которые будут выполняться при возникновении событий, а не при запуске verifyDialog. Другая проблема заключается в том, что вы возвращаете true или false внутри функции события, так что это не будет применяться к внешней функции verifyDialong.

Часть, основанная на нажатиях кнопок, должна быть пересмотрена. Возможно, поместите его в другую функцию и вызовите из обработчиков щелчков:

var afterConfirm = function(bool) {
    if(bool) {
        //continue clicked
    } else {
        //cancel clicked
    }
    //do for both cases here
}

//inside confirmDialog input#continue
$(this).click(function() {
    $(conf_dialog).remove();
    afterConfirm(true);
});

Возможно, вы захотите изучить возможность использования отложенных объектов.Вот две ссылки, которые их объясняют.

http://www.sitepen.com/blog/2009/03/31/queued-demystifying-deferreds/

http://api.dojotoolkit.org/jsdoc/1.3/dojo .Отложенный

Используя отложенный, вы могли бы воспользоваться своей вызывающей функцией:

function doSomething () {
  // this functions does something before calling confirmDialog
  if (confirmDialog) {
    // handle ok
  } else {
    // handle cancel
  }
  // just to be difficult lets have more code here
}

и реорганизуйте его во что-то вроде этого:

function doSomethingRefactored() {
  // this functions does something before calling confirmDialog

  var handleCancel = function() { /* handle cancel */};
  var handleOk = function() { /* handle ok */};
  var doAfter = function() { /* just to be difficult lets have more code here */};

  var d = new dojo.deferred();
  d.addBoth(handleOk, handleCancel);
  d.addCallback(doAfter);
  confirmDialog(message, d);
  return d;
}
  • confirmDialog должен быть обновлен для вызова d.callback() или d.errback() вместо возврата true или false
  • если функция, вызывающая doSomething, должна дождаться завершения работы doSomething, она может добавить свои собственные функции в цепочку обратного вызова

Надеюсь, это поможет...это будет иметь гораздо больше смысла после прочтения статьи sitepen.

Вы можете добавить тайм-аут до вызова следующей функции

http://www.w3schools.com/htmldom/met_win_settimeout.asp

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top