Έχω ένα widget JavaScript που παρέχει τυποποιημένα σημεία επέκτασης. Ένα από αυτά είναι η συνάρτηση beforecreate
. Θα πρέπει να επιστρέφει false
για να αποτρέψει τη δημιουργία ενός στοιχείου.
Έχω προσθέσει μια κλήση Ajax σε αυτή τη συνάρτηση χρησιμοποιώντας την 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);
});
}
Αλλά θέλω να αποτρέψω το widget μου από τη δημιουργία του στοιχείου, οπότε θα πρέπει να επιστρέψω false
στη μητρική συνάρτηση, όχι στην επανάκληση. Υπάρχει τρόπος να εκτελέσω ένα σύγχρονο αίτημα AJAX χρησιμοποιώντας το jQuery ή οποιοδήποτε άλλο API εντός του προγράμματος περιήγησης;
Από την τεκμηρίωση της jQuery: καθορίζετε την επιλογή asynchronous να είναι false για να λάβετε μια σύγχρονη αίτηση Ajax. Στη συνέχεια, το callback σας μπορεί να ορίσει κάποια δεδομένα πριν προχωρήσει η μητρική σας συνάρτηση.
Εδώ'είναι πώς θα έμοιαζε ο κώδικάς σας αν άλλαζε όπως προτείνεται:
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
});
}
Μπορείτε να θέσετε τη ρύθμιση Ajax της jQuery's σε σύγχρονη λειτουργία καλώντας το
jQuery.ajaxSetup({async:false});
Και στη συνέχεια να εκτελέσετε τις κλήσεις Ajax χρησιμοποιώντας jQuery.get( ... );
Στη συνέχεια, απλά ενεργοποιήστε το ξανά μία φορά
jQuery.ajaxSetup({async:true});
Υποθέτω ότι λειτουργεί το ίδιο πράγμα που πρότεινε ο @Adam, αλλά μπορεί να είναι χρήσιμο σε κάποιον που θέλει να επαναδιαμορφώσει το jQuery.get()
ή το jQuery.post()
στην πιο περίπλοκη σύνταξη jQuery.ajax()
.
Εξαιρετική λύση! Παρατήρησα όταν προσπάθησα να την εφαρμόσω ότι αν επέστρεφα μια τιμή στη ρήτρα επιτυχίας, αυτή επέστρεφε ως απροσδιόριστη. Έπρεπε να την αποθηκεύσω σε μια μεταβλητή και να επιστρέψω αυτή τη μεταβλητή. Αυτή είναι η μέθοδος που βρήκα:
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;
}