Ich habe ein JavaScript-Widget, das standardmäßige Erweiterungspunkte bietet. Einer davon ist die Funktion beforecreate
. Sie sollte false
zurückgeben, um zu verhindern, dass ein Element erstellt wird.
Ich habe einen Ajax-Aufruf in diese Funktion mit jQuery eingefügt:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Aber ich möchte verhindern, dass mein Widget das Element erstellt, also sollte ich false
in der Mutterfunktion zurückgeben, nicht im Callback. Gibt es eine Möglichkeit, eine synchrone AJAX-Anfrage mit jQuery oder einer anderen browserinternen API durchzuführen?
Aus der jQuery-Dokumentation: Sie setzen die Option asynchronous auf false, um eine synchrone Ajax-Anfrage zu erhalten. Dann kann Ihr Callback einige Daten setzen, bevor Ihre Mutterfunktion fortfährt.
So würde Ihr Code aussehen, wenn Sie ihn wie vorgeschlagen ändern:
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
Sie können das Ajax-Setup von jQuery in den synchronen Modus versetzen, indem Sie
jQuery.ajaxSetup({async:false});
Und dann führen Sie Ihre Ajax-Aufrufe mit jQuery.get( ... );
aus.
Dann schalten Sie es einfach wieder ein, sobald
jQuery.ajaxSetup({async:true});
Ich denke, es funktioniert genauso wie von @Adam vorgeschlagen, aber es könnte für jemanden hilfreich sein, der seine jQuery.get()
oder jQuery.post()
auf die aufwändigere jQuery.ajax()
Syntax umstellen möchte.
Ausgezeichnete Lösung! Als ich versuchte, sie zu implementieren, bemerkte ich, dass, wenn ich einen Wert in der Erfolgsklausel zurückgab, dieser als undefiniert zurückkam. Ich musste ihn in einer Variablen speichern und diese Variable zurückgeben. Dies ist die Methode, die ich mir ausgedacht habe:
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl = "", strReturn = "";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}