J'ai un widget JavaScript qui fournit des points d'extension standard. L'un d'entre eux est la fonction beforecreate
. Elle doit retourner false
pour empêcher la création d'un élément.
J'ai ajouté un appel Ajax à cette fonction en utilisant jQuery :
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);
});
}
Mais je veux empêcher mon widget de créer l'élément, donc je devrais retourner false
dans la fonction mère, pas dans le callback. Existe-t-il un moyen d'effectuer une requête AJAX synchrone à l'aide de jQuery ou de toute autre API intégrée au navigateur ?
D'après la [documentation jQuery][1] : vous spécifiez que l'option asynchrone est false pour obtenir une requête Ajax synchrone. Ensuite, votre callback peut définir certaines données avant que votre fonction mère ne procède.
Voici à quoi ressemblerait votre code s'il était modifié comme suggéré :
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
});
}
Vous pouvez mettre la configuration Ajax de jQuery en mode synchrone en appelant
jQuery.ajaxSetup({async:false});
Et ensuite, effectuez vos appels Ajax en utilisant jQuery.get( ... );
.
Ensuite, il suffit de l'activer à nouveau une fois
jQuery.ajaxSetup({async:true});
Je suppose que cela revient au même que celui suggéré par @Adam, mais cela pourrait être utile à quelqu'un qui veut reconfigurer son jQuery.get()
ou son jQuery.post()
à la syntaxe plus élaborée de jQuery.ajax()
.
Excellente solution ! J'ai remarqué, lorsque j'ai essayé de la mettre en œuvre, que si je renvoyais une valeur dans la clause de succès, elle revenait indéfinie. Je devais la stocker dans une variable et retourner cette variable. Voici la méthode que j'ai trouvée :
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;
}