Errore JavaScript: etichetta non valida? Cosa significa questo?
-
28-10-2019 - |
Domanda
nessun problema! Sembra più testo di quanto non sia ;-) Quindi per favore continua a leggere!
Le domande principali sono:
- Cosa fa l'errore: Etichetta non valida significare?
- Dov'è l'errore nel mio script?
Ora inizia la roba geek ;-):
Ho uno script che carica gli elementi di una lingua -array (elementi definiti tramite Lang_keys in JS - vedi sopra) dal server (Server fornisce una versione JSON di quell'array), per la lingua corrente.
con JS translate("<synonym>");
funzione si ottiene il testo richiesto nella lingua corrente. AGGIORNAMENTO: jQuery 1.5 non minimizzato (vecchio: jquery.js (v1.4.1 - minimizzato)) è caricato e anche lang.js.
Quindi ricevo un errore, che non riesco a trovare
Devo aggiungere: il translate()
La funzione funziona senza errori e JS non viene interrotto. Tutte le funzioni funzionano come desiderato.Non ho altri errori e tutti i JS funzionano bene ... ma non voglio essere sorpreso dal Futur, quindi devo sbarazzarmi di quell'errore.
Output della console in Chrome (che è elencato dopo la richiesta AJAX [/query/js_lang/json]):
Uncaught SyntaxError: Unexpected token : jQuery.jQuery.extend.globalEvaljquery.js:602
jQuery.ajaxSetup.converters.text scriptjquery.js:6992
ajaxConvert jquery.js:6884
done jquery.js:6454
jQuery.ajaxTransport.send.callback jquery.js:7252
jQuery.ajaxTransport.send jquery.js:7261
jQuery.extend.ajax jquery.js:6646
(anonymous function) lang.js:116
Output della console in Firefox (che è elencato dopo la richiesta AJAX [/query/js_lang/json]):
invalid label
{"js_accept_terms":"Du musst unseren A...:"Kontaktname","js_agent_email":"Konta
Qualcuno può dirmi esattamente quale errore: invalid label
significa?
La mia sceneggiatura (lang.js) sembra così:
var month_names = new Array();
var day_names = new Array();
var lang_keys = new Array(
"js_accept_terms",
...
"nope"
);
var translations = new Array();
function translate(key, replace){
var translated = translations[key];
if(replace != undefined){
for(var i=0; i<replace.length; i++){
translated = translated.replace(/\%1/, replace);
}
}
return translated;
}
$.ajax({ //this is line 116
url: "/query/js_lang/json",
type: "post",
data: {keys: JSON.stringify(lang_keys)},
timeout: 7000,
success: function(data){
var trans = jQuery.parseJSON(data);
for(var key in trans){
translations[key.replace(/^js\_/, "")] = trans[key];
}
month_names = new Array(translate("jan"), translate("feb"), translate("mar"), translate("apr"), translate("may"), translate("jun"), translate("jul"), translate("aug"), translate("sep"), translate("oct"), translate("nov"), translate("dec"));
day_names = new Array(translate("sun"), translate("mon"), translate("tue"), translate("wed"), translate("thu"), translate("fri"), translate("sat"));
},
error: function(){
out_message("Error. No Language loaded!", "Error");
},
async: false
});
out_message()
Visualizza un Div in stile CSS. Sto usando quella funzione in altre parti del sito Web, dove funziona senza problemi.
Ho rimosso gli articoli in lang_keys
Laddove il valore di ritorno ha caratteri speciali come ':', umlauts, tagli e così via ... diciamo: l'ho testato con solo valori alfanumerici e ho ottenuto lo stesso errore.
Scusa per il mio inglese ;-) E grazie per il tuo aiuto
Soluzione 2
Bene, dopo qualche altra ricerca e alcuni suggerimenti in fili stackoverflow l'ho capito ora:
Il problema è che JQuery interpreta gli Ajax ricevuti i dati come script (JavaScript) per qualche motivo - deve avere qualcosa con cui fare qualcosa eval()
funzione, che interpreta il primo oggetto JSON come script perché sembra / inizia come un'istanza dell'oggetto.
Questo si verifica (nel mio caso) solo se il La chiamata Ajax viene effettuata prima che il sito venga caricato completamente. Bene, con le chiamate Ajax interne alcuni $(function() { ... });
Codice non ci sono problemi finora.
Il trucco era quello di aggiungere i brani attorno alla stringa JSON nello script PHP
$return_value = "(" . json_encode($translation) . ")";
e rimuoverli dopo aver ricevuto nel callback dell'Ajax-Success
$.ajax({
...,
success: function(data){
data = data.substring(1,data.length-1); // for label error reason. getting json in breaktes,, which must be removed again
var trans = jQuery.parseJSON(data);
...
Solo FYI sulle etichette: Qui alcune informazioni riguardo a questo
Altri suggerimenti
Penso che il problema sia con il JSON restituito:
{"js_accept_terms":"Du musst unseren A...:"Kontaktname","js_agent_email":"Konta
Questo dovrebbe assomigliare a questo:
{"js_accept_terms":"Du musst unseren A...:\"Kontaktname","js_agent_email":"Konta
Potrebbe esserci un problema sul lato server. Il tuo codificatore JSON non sfugge a doppie citazioni.