Question

J'essaie d'utiliser la bibliothèque de boîtes de dialogue des alertes jQuery à partir de http://abeautifulsite.net/notebook/87 à la place des alertes par défaut (qui sont plutôt abominables à mon avis). Cela semble être une excellente bibliothèque, mais il n'y a pas d'exemple d'utilisation de la bibliothèque jConfirm.

Je dois faire quelque chose comme ça:

function confirm() {
        var result = false;
        var response = false;
        jConfirm('are you sure?', 'Confirmation Dialog',
          function(r) {
            result = r;
            response = true;
            return r;
        });
        if (response == true) {
            alert(result);
            return result;
        }
        else {
            //wait for response
            alert('hi');
        }
    }

et mon appel depuis mon bouton .net:

J'ai posté un commentaire sur le site Web du plugin (ce matin seulement) et Google a effectué une recherche javascript et attendu qu'un rappel soit terminé sans aucun résultat.

Avez-vous des idées sur la façon d'utiliser correctement le rappel pour obtenir le résultat, avant que le reste du javascript ne s'exécute?

Merci.

Était-ce utile?

La solution

jConfirm('are you sure?', 'Confirmation Dialog',
    function(r) {
        result = r;
        response = true;
        return r;
    }
);
if (response == true) {

Cela révèle une incompréhension de la séquence d'événements qui se produit à l'aide d'un code asynchrone. Ce n’est pas parce que vous l’avez écrit en ligne que son exécution s’exécutera strictement de haut en bas.

  1. jConfirm est appelé, recevant une fonction parmi ses paramètres, dont elle se souvient.
  2. jConfirm affiche son interface utilisateur sur la page et revient immédiatement.
  3. La ligne 'if (response == true)' est exécutée. Vraiment, cela devrait simplement se lire "si (réponse)", la comparaison booléenne est superflue. Mais dans tous les cas, la réponse est bien sûr fausse. Votre fonction abandonne et quitte, rendant le contrôle au navigateur.
  4. L'utilisateur clique sur l'interface utilisateur de jConfirm.
  5. jConfirmez seulement maintenant de passer à l’action et de rappeler la fonction que vous lui avez attribuée.
  6. Votre fonction imbriquée donne la valeur true à la réponse, bien trop tard pour que la condition 'if (response == true)' fasse quoi que ce soit avec elle.

Vous avez écrit & //; attendre la réponse " mais vous ne pouvez pas écrire de code JavaScript capable de le faire. Votre fonction doit revenir pour redonner le contrôle au navigateur, avant que celui-ci ne puisse déclencher les événements de clic sur l'interface utilisateur jConfirm qui assurent le traitement.

Il existe des moyens de faire fonctionner un code asynchrone dans un contexte synchrone (et inversement) - en particulier des threads et des coroutines (et leurs générateurs de relations limitées). Mais JavaScript ne possède aucune de ces fonctionnalités. Vous devez donc écrire votre code pour qu'il corresponde au modèle synchrone ou asynchrone utilisé par votre bibliothèque.

Autres conseils

Vous venez de frapper une grosse limite en JavaScript. Une fois que votre code entre dans le monde asynchrone, il n’ya aucun moyen de revenir à un flux d’exécution procédurale classique.

Dans votre exemple, la solution serait de créer une boucle attendant que la réponse soit remplie. Le problème est que JavaScript ne fournit aucune instruction qui vous permette de boucler indéfiniment sans prendre 100% de la puissance de traitement. Vous finirez donc par bloquer le navigateur, au point que votre utilisateur ne pourra plus répondre à la question.

La seule solution consiste à s’en tenir au modèle asynchrone et à le conserver. Mon conseil est que vous devriez ajouter un rappel à toute fonction devant effectuer un travail asynchrone, afin que l'appelant puisse exécuter quelque chose à la fin de votre fonction.

function confirm(fnCallback) 
{
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) 
    {
        // Do something with r 

        fnCallback && fnCallback(r); // call the callback if provided
    });
}

// in the caller

alert('begin');

confirm(function(r)
{
    alert(r);

    alert('end');
})

Étant donné que le rappel est asynchrone (du moins en ce sens qu'il attend que l'utilisateur fasse quelque chose), il pourrait être plus facile de gérer ce dont vous avez besoin dans le rappel:

function confirm() {
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
        if (r) doSomething();
    });
}

@klogan [commentaires]

Je suppose que vous les avez obtenues de ici ?

La page vous donne votre réponse: (consultez la section Utilisation )

.
  

Ces méthodes ne renvoient pas les mêmes valeurs que confirm () et prompt (). Vous devez accéder aux valeurs obtenues à l'aide d'une fonction de rappel. (Voir la démo pour plus de détails.)

@klogan

Ce que je veux dire, c’est qu’il n’ya pas vraiment de moyen facile de réaliser ce que vous voulez. Vous essayez de mettre en corrélation les procédures procédurales et la programmation événementielle - quelque chose que JavaScript ne vous aide pas à faire.

La solution la plus simple (bien que, Risque ) consiste à utiliser une boucle pseudo-infinie. Mais si callback n'est jamais appelé, vous avez maintenant une boucle infinie réelle. Et, selon le moteur JavaScript, vous pourriez tuer le navigateur en attente.

Point: Votre meilleur pari est d'éviter cette tentative de forcer les événements à passer à la procédure.

function confirm() {
    var result = false;
    var response = false;

    jConfirm('are you sure?', 'Confirmation Dialog',
      function(r) {
        result = r;
        response = true;
    });

    while(!response) continue; // wait
    return result;
}

Techniquement, oui , je ne le ferais pas sur un site Web.

Consultez le JavaScript narratif , basé sur Narcissus .

  

JavaScript narratif est une petite extension du langage JavaScript qui permet le blocage de rappels d’événements asynchrones. Cela rend le code asynchrone lisible et compréhensible de façon rafraîchissante.

Selenium utilise cette technologie.

Mettre à jour

Découvrez JavaScript Brins :

  

JavaScript Strands ajoute la coroutine et   soutien de filetage coopératif à la   Langage JavaScript pour activer le blocage   capacités pour événement asynchrone   rappels. Cela rend le code qui   utilise beaucoup le fonctionnement asynchrone   plus linéaire, lisible et gérable.   Strands est construit sur Narrative   JavaScript écrit par Neil Mix, et   beaucoup de JavaScript Narrative a   resté dans les brins, y compris une grande partie de   cette documentation.

     

En JavaScript, votre code ne peut pas simplement   attendre qu'un événement se soit déclenché - la   événement doit toujours être géré par un   gestionnaire d'événements asynchrone séparé.   Parfois ça va, mais c'est souvent   oblige ce qui devrait être simple   séquence de déclarations en noueux   des contorsions. Il casse aussi le   capacité à encapsuler la fonctionnalité   parce que les fonctions d'appel doivent savoir   fournir un gestionnaire de rappel. Brins   offre la possibilité de suspendre et   reprendre les threads d'exécution. Exécution   peut suspendre la reprise lorsque l'événement est   fini. Cela vous permet d'écrire   événement asynchrone difficile à lire   manipulation simple, linéaire, lisible   code qui encapsule l'implémentation.

Je suppose que vous devez saisir la réponse comme ceci. Je ne pense pas que vous ayez besoin d'un rappel.

function confirm() {
        var response = jConfirm('are you sure?', 'Confirmation Dialog');
        if (response) {
            alert(result);
        }
        else {
            //wait for response
            alert('hi');
        }
    }

Je pense avoir mis au point une solution possible à ce problème. Je lisais cet article: http://treasure4developer.wordpress.com/2008 / 06/23 / appeler-postback-événement-de-javascript /

Fondamentalement, l’idée est de forcer la publication à partir de javascript. Au début, j’ai constaté que la publication fonctionnait, mais elle n’appelait pas mon événement de bouton, mais après avoir lu l’article, j’ai découvert que je pouvais détecter si c’était de la publication javascript. il suffit d'appeler une méthode pour effectuer le traitement

Cordialement DotnetShadow

Comment les gars ont dit, il n'y a pas moyen! mais ... comme on dit dans mon pays (le Brésil), le gambi:

nous pouvons faire quelque chose comme ça:

<h:commandLink styleClass="linkValor xExcluir" value="x"  
                     onclick="if(confirmar('Confirmar excluir.','Deseja realmente excluir este registro?', this)) return true; else return false;"
                     action="#{mBeanPesquisarLinhas.excluir}"/>

et le javascript:

function confirmar(titulo, msg, elemento) { 

    if ($(elemento).attr('sim')) {      
        $(elemento).removeAttr('sim');      
        return true;
    } else if ($(elemento).attr('nao')) {       
        $(elemento).removeAttr('nao');      
        return false;
    } else {
        $("#dialog-confirm").html('<p>' + msg + '</p>').dialog({
            resizable : false,
            height : 200,
            modal : true,
            title : titulo,
            buttons : {
                "Sim" : function() {
                    $(this).dialog("close");
                    $(elemento).attr('sim', 'sim');
                    $(elemento).click();
                },
                "Não" : function() {
                    $(this).dialog("close");
                    $(elemento).attr('nao', 'nao');
                    $(elemento).click();
                }
            }
        });
    }

    return false;
}

c'est le même problème mais en utilisant jquery-ui.

Au revoir et j'espère que cela pourra aider quelqu'un.

Pensez aux rappels comme à l'envoi de messages, ce qui donnera une meilleure structure à votre code.

Cette chose fonctionne. Nécessite jQuery.

function myconfirm(kyssa, elm, e){ // neG
    if(jQuery('#confirmquestion').data('result')){
        var V = jQuery('#confirmquestion').data('result');
        jQuery('#confirmquestion').remove(); 
        return V == 'Y' ? true : false;         
    }else if(!jQuery('#confirmquestion').length){
        jQuery('body').append('<div id="confirmquestion">'+
        '<h4>Kinnitus</h4>'+
        '<div id="kyssa">'+kyssa+'</div>'+
        '<center>'+
        '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'Y\');">Jah</button>&nbsp;'+
        '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'N\');">Ei</button></div>'+
        '</center>');
        jQuery('#confirmquestion button').click(function(){
            jQuery(elm).trigger(e.type);
        })
    }       
    return false;
}

onChange="if(myconfirm(\'Saada kiri: \'+jQuery(this).find(\'option:selected\').html()+\' ?\', this, event)) { ... }"

CSS

#confirmquestion{
    border:1px solid #999;
    background:white;
    padding-bottom: 30px;
    position:fixed;
    width:300px;
    font-size:12px;
    top:45%;
    left:50%;
    margin-left:-150px;
}

#confirmquestion h4 {
    background:blue;
    color:white;
    margin:0;
    padding: 2px 5px;
    border-bottom:#777; 
    text-align:center;
}

#confirmquestion #kyssa {
    padding: 30px 25px;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top