jquery - valeur de retour à l'aide d'ajax résultat sur la réussite
J'ai un petit problème avec jquery $.ajax() de la fonction.
J'ai un formulaire où chaque clic sur le bouton radio ou de la sélection dans le menu déroulant crée une variable de session avec la valeur sélectionnée.
Maintenant - j'en ai un de la liste déroulante des menus à 4 options - le premier (avec étiquette Aucun) a une valeur="" d'autres ont leurs papiers d'identité.
Ce que je veux est d'Aucune option (avec une valeur vide) pour supprimer la session et d'autres pour en créer un, mais seulement si la session avec ce spécifique, sélectionnez le nom n'existe pas déjà - comme toutes les autres options ont le même montant attribué à l'il - c'est juste indiquant ce qui a été sélectionné.
Je ne sais pas si c'est raisonnable, mais ont un oeil sur le code - peut-être cela va le rendre plus clair:
$("#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();
});
donc - tout d'abord lors de la #add_ons sélectionnez menu déclencheurs "changement", nous obtenons des valeurs de quelques éléments pour les calculs.
nous obtenons l'attribut label de l'option de notre sélectionner les magasins de la valeur ajoutée au total, nom de le sélectionner pour créer une session avec ce nom et de la valeur à plus tard qui a été sélectionné.
maintenant - nous vérifier si le val == "" (ce qui pourrait indiquer qu'Aucune option a été choisie) et nous déduire le montant de la somme totale ainsi que la suppression de la session de la sélection du nom.
Après c'est là que le problème commence - else.
Autre, nous voulons vérifier si la isSession fonction de() avec le nom de notre sélecteur retourne 0 ou 1 - si elle renvoie la valeur 0, puis on ajoute au total de la valeur stockée dans l'attribut label, mais si elle renvoie 1 - qui donnerait à penser que la session existe déjà - nous de modifier la valeur de cette session par le recréer mais le montant n'est pas ajouté.
Maintenant isSession fonction ressemble à ceci:
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');
}
});
}
Maintenant le problème est que je ne sais pas si l'utilisation de "retour" sera de retour le résultat de la fonction - comme il semble ne pas fonctionner, cependant, si j'ai mis les "données" dans la réussite: la section de l'alerte - il ne semble pas renvoyer la valeur de droite.
Personne ne sait comment faire pour renvoyer la valeur de la fonction et de le comparer à la prochaine déclaration?
Merci les gars, j'ai essayé de la façon suivante:
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');
}
});
}
puis le updateResult() fonction:
fonction updateResult(data) {
résultat = données;
}
résultat est la variable globale - qui je suis alors d'essayer de lire:
$("#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();
});
mais pour une raison qu'il ne fonctionne pas - il une idée?
- double possible de Comment faire pour retourner la réponse d'un appel AJAX?
I have a small problem with jquery....
C'est la plus longue petit problème que j'ai jamais vu...;)- Il peut aider à résoudre ce problème: stackoverflow.com/questions/14220321/...
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous ne pouvez pas retourner une valeur à partir d'un appel asynchrone, comme une requête AJAX, et espérer qu'il fonctionne.
La raison en est que le code de l'attente de la réponse a déjà été exécutée par le temps de la réception de la réponse.
La solution à ce problème consiste à exécuter le code nécessaire à l'intérieur de la
success:
de rappel. De cette façon, il accède à ladata
seulement quand il est disponible.Une autre possibilité (qui est effectivement la même chose) est d'appeler une fonction à l'intérieur de votre
success:
rappel qui transmet les données lorsqu'il est disponible.async: false
). Dans certains cas, avoir un appel asynchrone n'est pas obligatoire. Plus sur jquery.ajax() doc api.jquery.com/jQuery.ajax , pas queAs of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated;
Il existe de nombreuses façons d'obtenir de l'AJAX de jQuery réponse. Je partage avec vous deux approches:
Première:
Deuxième:
vous pouvez le rendre aussi grand que vous voulez...
ajaxObj['responseText']
n'existe pas lorsque vous êtes à la définition devar ajaxResponse
J'ai vu les réponses à cette question et bien qu'utiles, ils n'étaient pas exactement ce que je voulais depuis que j'ai eu à modifier une grande partie de mon code.
Ce qui a fonctionné pour moi, était en train de faire quelque chose comme ceci:
Espoir aide à quelqu'un
anakin
Ajouter
async: false
à votre liste d'attributs. Cela force le javascript fil à attendre jusqu'à ce que la valeur de retour est extrait avant de passer. Évidemment, vous ne voulez pas de le faire dans chaque circonstance, mais si une valeur est nécessaire avant de procéder, cela va faire il.async: false
. Ce blocs everyhing sur la page pour la durée de la récupération. Vous savez ce que l'Un en AJAX signifie: Asynchrone. La bonne réponse serait que l'opération doit utiliser lesuccess()
rappel correctement.async: false
pourquoi aurait jQuery mise en œuvre de cette option? si je n'ai pas de charger de grandes quantités de données à la page et juste gérer un événement utilisateur, c'est ok qu'il bloque tout le reste dans le court laps de temps pour cet utilisateur particulier. rien de mal et rien de mauvais à ce sujet. (si utilisé correctement, il ne bloquera pas rien, car en ce moment pas d'autres actions pour l'utilisateur va se produire)async: false
. parfois vous avez juste besoin d'exécution synchrone et qu'est ce que c'est fait pour.async
param]C'est assez vieux et laid, ne le faites pas. Vous devez utiliser les rappels: https://stackoverflow.com/a/5316755/591257
Avait le même problème, résolu de cette façon, à l'aide d'un mondial var. Vous ne savez pas si c'est le meilleur, mais certainement œuvres. En cas d'erreur vous obtenez une chaîne vide (myVar = "), de sorte que vous pouvez gérer ce que nécessaire.
async: false
ici, parce qu'en asynchrone en mode il n'est pas garanti quedata
est enregistré dansmyVar
avantmyVar
est retourné.il peut aider, créer un appel ajax fonction et attacher une fonction qui appeler lorsque le succès de l'appel ajax, voir l'exemple
Bien que toutes les approches concernant l'utilisation de
async: false
ne sont pas bon à cause de sa désapprobation et bloqué la page jusqu'à ce que la demande est de retour. Donc voici 2 façons de le faire:1er: de Retour ensemble ajax réponse dans une fonction, puis de les utiliser de
done
fonction pour capturer la réponse lorsque la demande est terminée.(RECOMMANDÉ, LA MEILLEURE FAÇON)APPEL CI-DESSUS COMME SUIT:
POUR DE MULTIPLES APPELS AJAX UTILISER
$.when
:2e: Stocker la réponse dans un cookie et puis en dehors de l'appel ajax obtenir que la valeur du cookie.(NON RECOMMANDÉ)
REMARQUE: Dans l'exmple ci-dessus
jquery cookies
bibliothèque est utilisée.Il est très léger et fonctionne en tant que dynamique. Voici le lien https://github.com/js-cookie/js-cookieAvec l'Aide de ici
Espère que cela aide quelqu'un, quelque part un peu.
async: false,
est préhistorique et est obsolète depuis jQuery v1.8, Il sera probablement aider à neHi essayer async:false dans votre appel ajax..