Pregunta

La siguiente función confirmDialog se llama a la mitad de otra función jquery. Cuando este confirmarDialog devuelve verdadero, se supone que la otra función continuará ... pero no lo hace. La razón de esto parece ser que toda la función confirmDialog ya se ha ejecutado (devolviendo falso) para cuando se hace clic en el botón continuar. ¿Cómo puedo retrasar la devolución de algo hasta después de hacer clic en los botones?

(O, si estoy completamente en el camino equivocado, ¿cuál es el problema y cómo lo soluciono?)

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;
    }); 
}
¿Fue útil?

Solución

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;
  })
  ...
}

Otros consejos

No estoy seguro de que puedas. AFAIK solo la función incorporada como confirmar , alert o prompt puede bloquearse al pedir una respuesta.

La solución general es refactorizar su código para usar devoluciones de llamada (o usar las funciones integradas). Eso significaría dividir la función de la persona que llama en dos y ejecutar la segunda parte cuando se obtenga la entrada.

En confirmDialog, está configurando controladores de eventos, que se ejecutarán cuando se activen los eventos, no cuando se ejecute confirmDialog. Otro problema es que devuelve verdadero o falso dentro de la función de evento, por lo que no se aplicará a la función externa confirmDialong.

La parte que se basa en presionar los botones necesitaría ser refactorizada. Quizás ponerlo en otra función y llamarlo desde los controladores de clic:

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);
});

Es posible que desee considerar el uso de objetos diferidos. Aquí hay dos enlaces que los explican.

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

http://api.dojotoolkit.org/jsdoc/1.3/dojo.Deferred

Usando un diferido puede tomar su función de llamada:

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
}

y refactorizarlo a algo como esto:

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 tendría que ser actualizado para llamar a d.callback () o d.errback () en lugar de devolver true o falso
  • si la función que llama Algo debe esperar Algo para terminar puede agregar su funciones propias de la cadena de devolución de llamada

Espero que esto ayude ... tendrá mucho más sentido después de leer el artículo del sitio abierto.

Puede agregar un tiempo de espera antes de que se llame a la siguiente función

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top