Pregunta

¡sin preocupaciones! Parece más texto de lo que es ;-) ¡Así que, por favor, continúe leyendo!

Las preguntas principales son:

  • ¿Qué hace el error? etiqueta no válida ¿significar?
  • ¿Dónde está el error en mi script?

Ahora comienza las cosas geek ;-):

Tengo un script que carga elementos de una matriz de idioma (elementos definidos a través de lang_keys en js - ver arriba) desde el servidor (el servidor ofrece una versión JSON de esa matriz), para el idioma actual.

con js translate("<synonym>"); Función que obtiene el texto requerido en el idioma actual. Actualización: jQuery 1.5 no minificado (antiguo: jQuery.js (V1.4.1 - minificado)) está cargado y lang.js también.

Así que recibo un error, que simplemente no puedo encontrar

Tengo que agregar: el translate() La función funciona sin errores y el JS no se interrumpe. Todas las funciones funcionan según lo desee.No tengo ningún otro error y todo el JS funciona bien ... pero no quiero sorprenderme en el futuro, así que necesito deshacerme de ese error.

Salida de la consola en Chrome (que se enumera después de la solicitud 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

Salida de la consola en Firefox (que se enumera después de la solicitud AJAX [/QUERY/JS_LANG/JSON])::

invalid label
{"js_accept_terms":"Du musst unseren A...:"Kontaktname","js_agent_email":"Konta

¿Alguien puede decirme exactamente cuál es el error: invalid label ¿medio?

Mi guión (lang.js) se ve así:

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() Muestra un div. Estoy usando esa función en otras partes del sitio web, donde funciona sin ningún problema.

Quité artículos en lang_keys donde el valor de retorno tiene caracteres especiales como ':', umlauts, cortes, etc. ... Digamos: Lo probé solo con valores alfanuméricos y obtuve el mismo error.

Perdón por mi inglés ;-) Y gracias por tu ayuda

¿Fue útil?

Solución 2

Bueno, después de un poco más de investigación y algunas sugerencias en los hilos de Stackoverflow, lo descubrí ahora:

El problema es que jQuery interpreta que AJAX recibió datos como un script (JavaScript) por alguna razón, debe tener algo con lo que eval() función, que interpreta el primer objeto JSON como script porque parece / comienza como una instancia de objeto.

Esto ocurre (en mi caso) solo si el La llamada de Ajax se realiza antes de que el sitio se cargue por completo. Bueno, con Ajax llama a $(function() { ... }); Código No hay problemas hasta ahora.

El truco era agregar brakets alrededor de la cadena JSON en el script PHP

$return_value = "(" . json_encode($translation) . ")";

y retirarlos después de recibir en la devolución de llamada de 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 para su información sobre las etiquetas: Aquí alguna información sobre eso

Otros consejos

Creo que el problema es con el JSON devuelto:

{"js_accept_terms":"Du musst unseren A...:"Kontaktname","js_agent_email":"Konta

Esto debería verse algo así:

{"js_accept_terms":"Du musst unseren A...:\"Kontaktname","js_agent_email":"Konta

Puede haber un problema en el lado del servidor. Su codificador JSON no escapa de citas dobles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top