2008-12-02 14 views
10

Recibo un error de sintaxis (undefined line 1 test.js) en Firefox 3 cuando ejecuto este código. La alerta funciona correctamente (muestra 'trabajo') pero no tengo idea de por qué estoy recibiendo el error de sintaxis.jQuery .getJSON Firefox 3 Error de sintaxis No definido

código jQuery:

$.getJSON("json/test.js", function(data) { 
    alert(data[0].test); 
}); 

Test.js:

[{"test": "work"}] 

alguna idea? Estoy trabajando en esto para un archivo .js más grande, pero lo he reducido a este código. ¿Qué es una locura es que si puedo reemplazar el archivo local con una ruta remota no hay error de sintaxis (he aquí un ejemplo):

http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?

+0

Se puede publicar un caso de prueba? ¿No debería ser $ .getJSON? – Greg

+0

Sí, perdón por el error tipográfico. No estoy seguro de lo que está pidiendo en el caso de prueba? – Mike

+0

¿Por qué devuelve una matriz en test.js? ¿Por qué no solo el objeto? – James

Respuesta

23

he encontrado una solución para poner ese error

$.ajaxSetup({'beforeSend': function(xhr){ 
    if (xhr.overrideMimeType) 
     xhr.overrideMimeType("text/plain"); 
    } 
}); 

Ahora la explicación: en Firefox 3 (y yo Asume solamente Firefox TRES) todos los archivos que tiene el tipo MIME "text/xml" es analizado y sintaxis-verificado. Si inicia su JSON con un "[" se generará un error de sintaxis, si comienza con "{" es un "error mal formado" (mi traducción para "nicht wohlgeformt"). Si accedo a mi archivo json desde una secuencia de comandos local, no se incluye ningún servidor en este progreso, tengo que anular el tipo de mimo ... Tal vez configures incorrectamente tu tipo MIME para ese mismo archivo ...

Cómo siempre, la adición de esta pequeña pieza de código le ahorrará a partir de un mensaje de error-

Editar: En jQuery 1.5.1 o superior, puede utilizar la opción mimeType para lograr el mismo efecto. Para establecer como predeterminado para todas las solicitudes, utiliza

$.ajaxSetup({ mimeType: "text/plain" }); 

También puede utilizarlo con $ .ajax directamente, es decir, sus llamadas se traduce en

$.ajax({ 
    url: "json/test.js", 
    dataType: "json", 
    mimeType: "textPlain", 
    success: function(data){ 
     alert(data[0].test); 
    } }); 
+1

También funciona para anular el tipo de contenido en el lado del servidor usando el encabezado de tipo de contenido –

+0

Peter: ¡Gracias, gracias, * gracias *! Estaba teniendo este problema (http://stackoverflow.com/questions/2618959/not-well-formed- warning-when-loading-client-side-json-in-firefox-via-jquery-aja/) que resolví con tu respuesta aquí. Hice un cambio, y fue utilizar "application/json" en lugar de "text/plain". – Ryan

+1

en su segundo ejemplo usando '$ .ajax',' mimeType: 'textPlain'' no parece funcionar para mí, mientras que 'mimeType:' text/plain'' sí. – shennan

0

Intente cambiar el nombre "Test.js" a "test.json", que es lo Wikipedia dice que es la extensión oficial para los archivos JSON. Tal vez se esté procesando como Javascript en algún momento.

+0

No, eso no lo hizo. Mismo error de sintaxis (undefined line 1 test.json) – Mike

0

¿Has probado a deshabilitar todas las extensiones de Firefox?

Normalmente recibo algunos errores en la consola de Firebug que son causados ​​por las extensiones, no por los sitios web que se visitan.

+1

Sí, he intentado deshabilitar todos los complementos y todavía obtener el error a través de la consola de error. – Mike

1

Esto puede sonar realmente tonto, pero cambie la extensión de archivo para test.js de .js a .txt. Tuve la misma ocurrencia con archivos de datos JSON perfectamente válidos con bastante buena extensión excepto .txt (ejemplo: .json, .i18n). Como cambié la extensión, obtengo los datos y los uso muy bien.

Como dije, puede sonar tonto, pero funcionó para mí.

+0

Intenté cambiar a una extensión .txt y todavía me está dando el error. Puedo obtener todos los datos pero recibo el error. Por suerte, cuando se coloca en un servidor web real (en lugar de ejecutarse localmente) funciona bien (sin errores). – Mike

0

Compruebe si hay ; al final de test.js. jQuery ejecuta eval("(" + data + ")") y el punto y coma evitaría que Firefox encuentre el paréntesis de cierre. Y puede haber algunos otros personajes invisibles que le impidan hacerlo.

Puedo decirte por qué funciona esta ubicación remota, es porque se ejecuta de manera completamente diferente. Como tiene jsoncallback=? como parte de los parámetros de consulta, jQuery lo considera como JSONP y lo inserta en el DOM dentro de las etiquetas <script>. Intente utilizar "json/test.js?callback=?" como objetivo, también podría ayudar.

0

¿Qué tipo de servidor web está ejecutando? Una vez tuve un problema al leer un archivo JSON en IIS porque no estaba definido como un tipo MIME válido.

0

intente configurar el tipo de contenido del. js archivo. Firefox espera que sea text/plain, aparentemente. Puede hacerlo como lo hace Peter Hoffmann arriba, o puede configurar el lado del servidor del encabezado de tipo de contenido.

Esto podría significar un cambio en la configuración del lado del servidor (como el archivo mime.types de apache), o si se sirve el json desde una secuencia de comandos, estableciendo el encabezado de tipo de contenido en la secuencia de comandos.

O al menos eso parece haber hecho desaparecer el error para mí.

0

Tuve un problema similar pero estaba pasando por un bucle for. Creo que el problema podría ser que el índice está fuera de límite.

  • Kien
1

HI

que tienen este mismo error al probar la página web en mi PC local, pero una vez que esté en el servidor que aloja el error ya no sucede. Lo siento, no tengo idea del motivo, pero pensé que podría ayudar a alguien más a rastrear el motivo

2

getJSON puede estar insistiendo en al menos un nombre: par de valores.
Una matriz recta ["item0","item1","Item2"] es JSON válida, pero no hay nada con lo que hacer referencia en la función de devolución de llamada para getJSON.

En esta pequeña serie de códigos postales:

{"result":[["43001","ALEXANDRIA"],["43002","AMLIN"],["43003","ASHLEY"],["43004","BLACKLICK"],["43005","BLADENSBURG"],["43006","BRINKHAVEN"]]} 

... me he quedado atrapado hasta que he añadido el { "resultado": la etiqueta. Después pude hacer referencia a ella:

<script> 
     $.getJSON("temp_test_json.php","", 
     function(data) { 
      $.each(data.result, function(i, item) { 
       alert(item[0]+ " " + i); 
       if (i > 4) return false; 
       }); 
     }); 
</script> 

... También me pareció que era más fácil de usar $ each().

0

Para las personas que no utilizan jQuery, es necesario llamar al método overrideMimeType antes de enviar la solicitud:

var r = new XMLHttpRequest(); 
r.open("GET", filepath, true); 
r.overrideMimeType("text/plain"); 
Cuestiones relacionadas