Ich habe ein kleines Problem mit der Funktion jquery $ .ajax ().
Ich habe ein Formular, in dem jeder Klick auf das Optionsfeld oder jede Auswahl aus dem Dropdown-Menü eine Sitzungsvariable mit dem ausgewählten Wert erstellt.
Jetzt - ich habe eines der Dropdown-Menüs mit 4 Optionen - hat das erste (mit der Bezeichnung None) den Wert = "" andere haben ihre IDs.
Was ich tun möchte, ist die Option Keine (mit leerem Wert), um die Sitzung zu entfernen, und die andere, um eine zu erstellen, aber nur, wenn die Sitzung mit diesem bestimmten ausgewählten Namen noch nicht vorhanden ist - da allen anderen Optionen der gleiche Betrag zugewiesen ist - Es zeigt nur an, welches ausgewählt wurde.
Ich bin mir nicht sicher, ob das Sinn macht - aber schauen Sie sich den Code an - vielleicht wird dies klarer:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
if(isSession(name) == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
Also - zuerst, wenn das Auswahlmenü #add_ons "change" auslöst, erhalten wir einige Werte von einigen Elementen für Berechnungen.
Wir erhalten das Label-Attribut der Option aus unserer Auswahl, in der der Wert gespeichert wird, der zur Gesamtsumme hinzugefügt werden soll, den Namen der Auswahl, um eine Sitzung mit diesem Namen zu erstellen, und den Wert, um später zu überprüfen, welcher ausgewählt wurde.
Jetzt prüfen wir, ob der Wert == "" (was darauf hinweist, dass die Option Keine ausgewählt wurde) und ziehen den Betrag von der Gesamtsumme ab und entfernen die Sitzung mit dem Namen der Auswahl.
Danach beginnt das Problem - else-Anweisung.
Andernfalls möchten wir überprüfen, ob die Funktion isSession () mit dem Namen unseres Selektors 0 oder 1 zurückgibt. Wenn sie 0 zurückgibt, addieren wir den im label-Attribut gespeicherten Wert zur Gesamtsumme. Wenn sie jedoch 1 zurückgibt, würde dies nahe legen Diese Sitzung ist bereits vorhanden. Dann ändern wir den Wert dieser Sitzung nur, indem wir sie neu erstellen. Der Betrag wird jedoch nicht hinzugefügt.
Jetzt sieht die isSession-Funktion folgendermaßen aus:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
return data;
},
error: function() {
alert('Error occured');
}
});
}
Nun - das Problem ist - dass ich nicht weiß, ob die Verwendung von "return" das Ergebnis der Funktion zurückgibt - da es nicht zu funktionieren scheint -, wenn ich die "Daten" in den Abschnitt "success:" in den Abschnitt " alert - es scheint den richtigen Wert zurückzugeben.
Weiß jemand, wie man den Wert von der Funktion zurückgibt und ihn dann in der nächsten Anweisung vergleicht?
Danke Jungs - ich habe es folgendermaßen versucht:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
updateResult(data);
},
error: function() {
alert('Error occured');
}
});
}
dann die Funktion updateResult ():
Funktion updateResult (Daten) {Ergebnis = Daten; }}
Ergebnis - ist die globale Variable - die ich dann zu lesen versuche:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
isSession(name);
if(result == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
aber aus irgendeinem Grund - es funktioniert nicht - irgendeine Idee?
Antworten:
Das Problem ist, dass Sie einen Wert aus einem asynchronen Aufruf wie einer AJAX-Anforderung nicht zurückgeben und erwarten können, dass er funktioniert.
Der Grund dafür ist, dass der auf die Antwort wartende Code zum Zeitpunkt des Empfangs der Antwort bereits ausgeführt wurde.
Die Lösung für dieses Problem ist den notwendigen Code auszuführen innerhalb des
success:
Rückrufs. Auf diese Weise greift esdata
nur dann zu, wenn es verfügbar ist.Eine andere Möglichkeit (die praktisch dasselbe ist) besteht darin, eine Funktion in Ihrem
success:
Rückruf aufzurufen , die die Daten weiterleitet, sobald sie verfügbar sind.quelle
async: false
). In einigen Fällen ist ein asynchroner Aufruf nicht erforderlich. Mehr auf jquery.ajax () doc api.jquery.com/jQuery.ajax , nicht dasAs of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated;
Es gibt viele Möglichkeiten, eine jQuery AJAX-Antwort zu erhalten. Ich teile mit Ihnen zwei gemeinsame Ansätze:
Zuerst:
Zweite:
Sie können es so groß machen, wie Sie wollen ...
quelle
ajaxObj['responseText']
var ajaxResponse
Ich habe die Antworten hier gesehen und obwohl sie hilfreich waren, waren sie nicht genau das, was ich wollte, da ich einen Großteil meines Codes ändern musste.
Was für mich geklappt hat, war so etwas zu tun:
Hoffnung hilft jemandem
Anakin
quelle
Obwohl alle Ansätze in Bezug auf die Verwendung von
async: false
nicht gut sind, weil es veraltet ist und die Seite stecken bleibt, bis die Anfrage zurückkommt. Es gibt also zwei Möglichkeiten, dies zu tun:1. Geben Sie die gesamte Ajax-Antwort in einer Funktion zurück und verwenden Sie dann die
done
Funktion, um die Antwort zu erfassen, wenn die Anforderung abgeschlossen ist. (EMPFOHLEN, DER BESTE WEG)RUFEN SIE DAS OBIGE WIE SO AN:
FÜR MEHRERE AJAX-ANRUFE VERWENDEN SIE
$.when
:2. Speichern Sie die Antwort in einem Cookie und erhalten Sie dann außerhalb des Ajax-Aufrufs diesen Cookie-Wert. (NICHT EMPFOHLEN)
HINWEIS: Im obigen Beispiel wird die
jquery cookies
Bibliothek verwendet. Sie ist recht leicht und funktioniert bissig. Hier ist der Link https://github.com/js-cookie/js-cookiequelle
Fügen Sie
async: false
Ihrer Attributliste hinzu. Dies zwingt den Javascript-Thread, zu warten, bis der Rückgabewert abgerufen wurde, bevor er fortfährt. Natürlich möchten Sie dies nicht unter allen Umständen tun, aber wenn ein Wert benötigt wird, bevor Sie fortfahren, wird dies getan.quelle
async: false
. Dies blockiert alles auf der Seite für die Dauer des Abrufs. Sie wissen, wofür das A in AJAX steht: Asynchron. Die richtige Antwort wäre, dass OP densuccess()
Rückruf richtig verwenden muss.async: false
warum hätte jQuery diese Option implementiert? Wenn ich keine großen Datenmengen auf die Seite lade und nur ein Benutzerereignis behandle, ist es in Ordnung, dass alles andere in der kurzen Zeit für diesen bestimmten Benutzer blockiert wird. nichts falsches und nichts schlechtes daran. (Bei korrekter Verwendung wird nichts blockiert, da in dieser bestimmten Zeit keine weiteren Aktionen für diesen bestimmten Benutzer ausgeführt werden.)Das ist ziemlich alt und hässlich, tu das nicht. Sie sollten Rückrufe verwenden: https://stackoverflow.com/a/5316755/591257
Hatte das gleiche Problem und löste es auf diese Weise mit einer globalen Variable. Ich bin mir nicht sicher, ob es das Beste ist, aber es funktioniert auf jeden Fall. Bei einem Fehler erhalten Sie eine leere Zeichenfolge (myVar = ''), sodass Sie diese nach Bedarf behandeln können.
quelle
async: false
hier auch hinzufügen , da im asynchronen Modus nicht garantiert ist, dassdata
gespeichert wird,myVar
bevormyVar
es zurückgegeben wird.Es kann hilfreich sein, eine allgemeine Ajax-Aufruffunktion zu erstellen und eine Funktion anzuhängen, die bei Erfolg den Ajax-Aufruf aufruft (siehe Beispiel)
quelle
Mit Hilfe von hier
Hoffe das hilft jemandem irgendwo ein bisschen.
quelle
async: false,
ist prähistorisch und seit jQuery v1.8 veraltet. Es wird wahrscheinlich niemandem helfenHallo, versuche asynchron: false in deinem Ajax-Aufruf.
quelle