Jeg har en JavaScript-widget, der indeholder standardudvidelsespunkter. En af dem er funktionen beforecreate
. Den skal returnere false
for at forhindre, at et element bliver oprettet.
I've tilføjet et Ajax-kald i denne funktion ved hjælp af 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);
});
}
Men jeg vil forhindre min widget i at oprette elementet, så jeg skal returnere false
i moderfunktionen, ikke i callbacken. Er der en måde at udføre en synkron AJAX-forespørgsel ved hjælp af jQuery eller en anden API i browseren?
Fra jQuery-dokumentationen: Du skal angive asynchronous til at være false for at få en synkron Ajax-forespørgsel. Så kan din callback indstille nogle data, før din moderfunktion fortsætter.
Her's hvordan din kode ville se ud, hvis den blev ændret som foreslået:
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
});
}
Du kan sætte jQuery's Ajax-opsætning i synkron tilstand ved at kalde
jQuery.ajaxSetup({async:false});
Og derefter udføre dine Ajax-opkald ved hjælp af jQuery.get( ... );
Så skal du bare slå det til igen en gang
jQuery.ajaxSetup({async:true});
Jeg tror, det virker på samme måde som foreslået af @Adam, men det kan være nyttigt for nogen, der ønsker at omkonfigurere deres jQuery.get()
eller jQuery.post()
til den mere udførlige jQuery.ajax()
syntaks.
Fremragende løsning! Jeg bemærkede, da jeg forsøgte at implementere den, at hvis jeg returnerede en værdi i succesklausulen, kom den tilbage som udefineret. Jeg var nødt til at gemme den i en variabel og returnere denne variabel. Dette er den metode, jeg fandt frem til:
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;
}