Frage

Ich versuche, die jQuery zu verwenden Warnungen Dialog Bibliothek von http://abeautifulsite.net/notebook/87 anstelle der Standard-Benachrichtigungen (die meiner Meinung nach ziemlich schrecklich aussehen). Dies scheint eine große Bibliothek zu sein, aber es gibt kein Beispiel dafür, wie die jConfirm Bibliothek verwenden.

Ich brauche so etwas zu tun:

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

und mein Anruf von meiner .net-Taste:

Ich habe einen Kommentar über das Plugin-Website veröffentlicht (heute morgen) und hat Google für Javascript sucht und das Warten auf einen Rückruf ohne Ergebnisse zu vervollständigen.

Alle Ideen, wie der Rückruf richtig verwenden um das Ergebnis zu bekommen, bevor der Rest der Ausführung von JavaScript ist?

Danke.

War es hilfreich?

Lösung

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

Dies verrät ein Mißverständnis der Sequenz von Ereignissen, die asynchronen Code auftritt, verwendet wird. Nur weil du geschrieben hast Inline bedeutet es nicht, es streng von oben nach unten auszuführen geht.

  1. jConfirm genannt wird, eine Funktion als eines seiner Parameter empfängt, die er sich erinnert.
  2. jConfirm zeigt seine Benutzeroberfläche auf der Seite und kehrt sofort zurück.
  3. Die 'if (Antwort == true)' Linie ausführt. Wirklich sollte dies nur lesen ‚wenn (Antwort)‘, der boolean Vergleich überflüssig ist. Aber in jedem Fall Antwort ist natürlich falsch. Ihre Funktion aufgibt und Ausgänge, Kontrolle geben an den Browser zurück.
  4. Der Benutzer klickt auf jConfirm UI.
  5. jConfirm nur springt nun in die Tat umzusetzen und ruft zurück, um die Funktion, die Sie es gab und es in Erinnerung früher.
  6. Ihre verschachtelte Funktion setzt Antwort wahr, viel zu spät für die ‚if (Antwort == true)‘ Zustand etwas damit zu tun.

Sie haben geschrieben „// auf Antwort warten“ als Alternative, aber es gibt keinen JavaScript-Code Sie schreiben, dass kann, wird das tatsächlich tun. Ihre Funktion muss die Steuerung wieder an den Browser zurück zu geben, bevor der Browser die Click-Ereignisse auf dem jConfirm UI abfeuern kann, die fortfahren machen verarbeiten.

Ways asynchrone Code Arbeit in einer synchronen Rahmen (und umgekehrt) zu machen bestehen - insbesondere Fäden und Koroutinen (und ihre begrenzten Beziehung Generatoren). Aber JavaScript hat keine dieser Funktionen, so müssen Sie Ihren Code schreiben, die synchron-oder-Asynchron-Modell Ihrer Bibliothek passen verwendet wird.

Andere Tipps

Sie haben drücken Sie einfach eine große Einschränkung in JavaScript. Sobald Ihr Code der asynchrone Welt betritt, gibt es keine Möglichkeit zu einem klassischen Verfahrensausführungsablauf zurück zu erhalten.

In Ihrem Beispiel wäre die Lösung eine Schleife für die Antwort zu warten, um gefüllt werden. Das Problem ist, dass JavaScript keine Anweisung, die Sie in einer Schleife auf unbestimmte Zeit, ohne dabei 100% der Rechenleistung ermöglicht. So können Sie den Browser am Ende werden blockiert, manchmal bis zu dem Punkt, wo Ihre Benutzer nicht in der Lage sein, die eigentliche Frage zu beantworten.

Die einzige Lösung ist hier zu dem asynchronen Modell bleiben und halten Sie es. Mein Rat ist, dass Sie einen Rückruf zu einem beliebigen Funktion hinzufügen sollen, das einige asynchrone Arbeit tun muß, damit der Anrufer etwas am Ende Ihrer Funktion ausführen kann.

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

Da der Rückruf asynchron (zumindest in dem Sinne, dass es auf dem Benutzer wartet, etwas zu tun), könnte es einfacher zu handhaben sein, was Sie brauchen, um im Innern des Rückrufs:

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

@klogan [Kommentare]

Ich nehme an, Sie bekommt diese von hier ?

Die Seite gibt Ihnen Ihre Antwort: (schauen Sie unter Verwendung )

  

Diese Methoden nicht die gleichen Werte wie bestätigen zurückkehren () und prompt (). Sie müssen die resultierenden Werte Zugriff auf eine Callback-Funktion. (Siehe die Demo für weitere Details.)


@klogan

Der Punkt, den ich versuche zu machen, dass es nicht wirklich eine einfache Möglichkeit, zu erreichen, was Sie wollen. Sie versuchen, Verfahren zu korrelieren und ereignisgesteuert Programmierung -. Etwas JavaScript helfen Ihnen nicht tun

Die einfachste (aber riskant ) Lösung ist eine pseudo-unendlich-Schleife zu verwenden. Aber, wenn callback nie aufgerufen wird, haben Sie jetzt eine tatsächliche Endlosschleife. Und auf dem JavaScript-Engine abhängig, können Sie den Browser warten töten.

Point:. Ihre beste Wette ist zu vermeiden das versuchen, ereignisgesteuert in prozedurale zu zwingen

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

Technisch Ja , aber ich würde das nicht tun auf einer Website.

Hier finden Sie aktuelle Narrative JavaScript , die auf der Basis weg ist Narcissus .

  

Narrative JavaScript ist eine kleine Erweiterung der JavaScript-Sprache, die blockierende Funktionen für asynchrone Ereignisrückrufe ermöglicht. Dies macht asynchroner Code erfrischend lesbar und verständlich.

Selen nutzt diese Technologie.


Update

Schauen Sie sich JavaScript Strands :

  

JavaScript Strands fügt Koroutine und   kooperative Threading Unterstützung der   JavaScript Sprache zu ermöglichen, blockieren   Funktionen für asynchrones Ereignis   Rückrufe. Dies macht Code,   viel verwendet einen asynchronen Betrieb   mehr linear, lesbar und überschaubar.   Strands baut auf Narrative   JavaScript geschrieben von Neil Mix, und   viel von Narrative JavaScript hat   blieb in Strands mit viel   Diese Dokumentation.

     

In JavaScript Code kann nicht einfach   warten, bis ein Ereignis ausgelöst hat - die   Ereignis muss immer durch ein behandelt werden   getrennte, asynchrone Ereignisbehandlungsroutine.   Manchmal ist dies in Ordnung, aber es oft   zwingt, was sollte ein einfach sein   Folge von Anweisungen in knorrigen   Verrenkungen. Es bricht auch die   Fähigkeit Funktionalität zu kapseln   weil Aufruf von Funktionen müssen wissen   bietet einen Callback-Handler. Strands   bietet die Möglichkeit, zu suspendieren und   Fortsetzen Ausführungsthreads. Ausführung   kann Lebenslauf auszusetzen, wenn das Ereignis   fertig. Dies ermöglicht es Ihnen zu schreiben   schwer zu lesen asynchrones Ereignis   Handhabung in einfachen, linearen, lesbar   Code, der Implementierung kapselt.

Ich würde annehmen, dass Sie die Antwort wie diese greifen müssen. Ich glaube nicht, dass Sie einen Rückruf benötigen.

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

Ich glaube, ich habe mit einer möglichen Lösung dieses Problems kommen. Ich las diesen Artikel: http://treasure4developer.wordpress.com/2008 / 06/23 / Aufruf-Postback-Ereignis-from-javascript /

Im Grunde ist die Idee, dass Sie die Postbacks von Javascript zu zwingen, zuerst fand ich, dass die Postbacks funktionieren würde, aber würde meine nicht Schaltfläche Ereignis nennen, aber nach dem Lesen des Artikels ich, dass ich gefunden konnte erkennen, ob es war Javascript Postbacks und nur eine Methode aufrufen, die Verarbeitung

zu tun

Viele Grüße DotnetShadow

Wie die Jungs gesagt, es gibt keinen Weg! aber ... wie wir in meinem Land (Brasilien) sagen verwenden, le gambi:

Wir können so etwas wie es tun:

<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}"/>

und die 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;
}

es ist das gleiche Problem, aber mit Jquery-ui.

Bye, und ich hoffe, dass dies jemand helfen kann.

Denken Sie über Rückrufe wie das Senden von Nachrichten, und es wird in einem besseren Struktur im Code führen.

Das Ding funktioniert. Benötigt 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top