Question

La fonction confirmDialog suivante est appelée à mi-chemin d’une autre fonction jquery. Lorsque cette confirmationDialog retourne à true, l'autre fonction est supposée continuer ... mais ce n'est pas le cas. La raison en est que toute la fonction confirmDialog a déjà été exécutée (retourne false) au moment où le bouton Continuer est cliqué. Comment puis-je retarder le renvoi de tout retour après avoir cliqué sur les boutons?

(Ou, si je suis complètement sur la mauvaise voie, quel est le problème et comment le résoudre?)

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;
    }); 
}
Était-ce utile?

La solution

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

Autres conseils

Je ne suis pas sûr que vous puissiez le faire. Autant que je sache, seule la fonction intégrée telle que confirmer , alerte ou peut être bloquante lors de la demande de réponse.

La solution de contournement générale consiste à refactoriser votre code pour utiliser des rappels (ou utiliser les fonctions intégrées). Cela signifie donc que vous divisez votre fonction d’appel en deux et que vous exécutez la deuxième partie lorsque l’entrée est obtenue.

Dans confirmDialog, vous configurez des gestionnaires d’événements qui s’exécutent lorsque les événements sont déclenchés, et non lorsque confirmDialog est exécuté. Un autre problème est que vous renvoyez true ou false dans la fonction event, de sorte que cela ne s'applique pas à la fonction externe confirmDialong.

La partie qui repose sur les pressions sur les boutons devra être re-factorisée. Peut-être le mettre dans une autre fonction et l'appeler depuis les gestionnaires de clics:

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

Vous voudrez peut-être utiliser des objets différés. Voici deux liens qui les expliquent.

http://www.sitepen.com/ blog / 2009/03/31 / file d'attente-démystification-différée /

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

En utilisant un différé, vous pouvez prendre votre fonction d’appel:

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
}

et le refactoriser à quelque chose comme ceci:

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 devrait être mis à jour pour appeler d.callback () ou d.errback () au lieu de retourner true ou faux
  • si la fonction qui appelle Quelque chose doit attendre Quelque chose à finir peut ajouter son propres fonctions à la chaîne de rappel

J'espère que cela vous aidera ... cela aura plus de sens après avoir lu l'article de sitepen.

Vous pouvez ajouter un délai d'attente avant que la fonction suivante soit appelée

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top