Εκτελώ μια κλήση AJAX στο σενάριο MooTools, αυτό λειτουργεί μια χαρά στον Firefox, αλλά στον Chrome λαμβάνω ένα `Uncaught SyntaxError: Δεν μπορώ να προσδιορίσω το γιατί. Σχολιάζοντας τον κώδικα για να προσδιορίσω πού είναι ο κακός κώδικας δεν αποδίδει τίποτα, σκέφτομαι ότι μπορεί να υπάρχει πρόβλημα με το JSON που επιστρέφεται. Ελέγχοντας στην κονσόλα βλέπω ότι το JSON που επιστρέφεται είναι το εξής:
{"votes":47,"totalvotes":90}
Δεν βλέπω κανένα πρόβλημα με αυτό, γιατί να εμφανιστεί αυτό το σφάλμα;
vote.each(function(e){
e.set('send', {
onRequest : function(){
spinner.show();
},
onComplete : function(){
spinner.hide();
},
onSuccess : function(resp){
var j = JSON.decode(resp);
if (!j) return false;
var restaurant = e.getParent('.restaurant');
restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
$$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
buildRestaurantGraphs();
}
});
e.addEvent('submit', function(e){
e.stop();
this.send();
});
});
Απλά μια πληροφορία για τους ανθρώπους που μπορεί να έχουν το ίδιο πρόβλημα - έπρεπε να κάνω τον διακομιστή μου να στείλει πίσω το JSON ως application/json και ο προεπιλεγμένος χειριστής jQuery λειτούργησε μια χαρά.
Αυτό μόλις μου συνέβη και ο λόγος δεν ήταν κανένας από τους παραπάνω λόγους. Χρησιμοποιούσα την εντολή getJSON της jQuery και πρόσθετα callback=?
για να χρησιμοποιήσω JSONP (καθώς έπρεπε να πάω cross-domain), και επέστρεφα τον κωδικό JSON {"foo":"bar"}
και έπαιρνα το σφάλμα.
Αυτό συμβαίνει επειδή θα έπρεπε να είχα συμπεριλάβει τα δεδομένα της επανάκλησης, κάτι σαν jQuery17209314005577471107_1335958194322({"foo":"bar"})
Εδώ είναι ο κώδικας PHP που χρησιμοποίησα για να το πετύχω αυτό, ο οποίος υποβαθμίζεται αν χρησιμοποιηθεί JSON (χωρίς callback):
$ret['foo'] = "bar";
finish();
function finish() {
header("content-type:application/json");
if ($_GET['callback']) {
print $_GET['callback']."(";
}
print json_encode($GLOBALS['ret']);
if ($_GET['callback']) {
print ")";
}
exit;
}
Ελπίζω ότι αυτό θα βοηθήσει κάποιον στο μέλλον.
Μόλις έλυσα το πρόβλημα. Υπήρχε κάτι που προκαλούσε προβλήματα με μια τυπική κλήση Request, οπότε αυτός είναι ο κώδικας που χρησιμοποίησα αντ' αυτού:
vote.each(function(element){
element.addEvent('submit', function(e){
e.stop();
new Request.JSON({
url : e.target.action,
onRequest : function(){
spinner.show();
},
onComplete : function(){
spinner.hide();
},
onSuccess : function(resp){
var j = resp;
if (!j) return false;
var restaurant = element.getParent('.restaurant');
restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
$$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
buildRestaurantGraphs();
}
}).send(this);
});
});
Αν κάποιος γνωρίζει γιατί το τυπικό αντικείμενο Request μου δημιουργούσε προβλήματα, θα ήθελα πολύ να μάθω.