Können Sie Javascript-Rückruf warten?
-
22-07-2019 - |
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.
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.
- jConfirm genannt wird, eine Funktion als eines seiner Parameter empfängt, die er sich erinnert.
- jConfirm zeigt seine Benutzeroberfläche auf der Seite und kehrt sofort zurück.
- 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.
- Der Benutzer klickt auf jConfirm UI.
- 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.
- 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 tunViele 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> '+
'<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;
}