2009-04-20 17 views
18

Estoy tratando de usar la función getJSON en jQuery para importar algunos datos y activar una función de devolución de llamada. La función de devolución de llamada no se ejecuta. Sin embargo, si intento lo mismo con la función get, funciona bien. Extrañamente, funciona con la función get incluso cuando paso "json" como tipo. ¿Por qué está pasando esto? Probé el siguiente archivo en Firefox 3 e Internet Explorer 7:la función de devolución de llamada no funciona cuando se usa la función getJSON en jQuery

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html><head> 
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> 
<title>ajax test</title> 
<script type="text/javascript" src="/jquery-1.3.2.min.js"></script> 
</head> 
<body> 
<input type="button" id="test1" value="get"> 
<input type="button" id="test2" value="getJSON"> 
<input type="button" id="test3" value="get with json type"> 
<script type="text/javascript"> 
$("#test1").click(function() { 
    $.get("index.html", 
     function(response) { 
      alert('hi'); 
      //works 
     } 
    ) 
}); 

$("#test2").click(function() { 
    $.getJSON("index.html", 
     function(response) { 
      alert('hi'); 
      //doesn't work 
     } 
    ) 
}); 

$("#test3").click(function() { 
    $.get("index.html", 
     function(response) { 
      alert('hi'); 
      //works 
     }, 
     "json" 
    ) 
}); 
</script> 
</body></html> 

Esto parece ocurrir sin importar lo que puedo acceder a la URL, el tiempo que está en el mismo dominio. Traté de pasar algunos datos y eso no hace la diferencia.

Por supuesto que puedo evitar el problema utilizando la función get como lo hice en mi tercera función de prueba, pero todavía tengo curiosidad de por qué esto está sucediendo.

Sé que hay un similar question preguntado aquí pero no respondió mi pregunta.

+0

¿Podría ser que el json esté mal formado? – karim79

+0

¿Qué hay en index.html? – grammar31

+0

Tal vez debería haber sido más claro. index.html es el archivo que publiqué anteriormente. Solo intento acceder al documento en sí, lo cual no es lo más útil. Simplemente lo puse porque era simple y conveniente. De nuevo, no parece importar lo que puse para la URL. ¿El json necesita ser válido? –

Respuesta

24

El json debe ser válido; de lo contrario, la devolución de llamada no se activará.

+0

Gracias por la respuesta rápida. –

+0

Es cierto, Firefox y IE reaccionan de manera diferente a JSON no válido –

+5

esta es una de esas cosas que parecen increíbles, ¿por qué fallaría silenciosamente? pero es absolutamente cierto. http://www.jsonlint.com/ es un buen validador. –

0

Bajo la superficie, cuando se llama getJSON, esto es lo que está pasando:

// ~ line 3216 
getJSON: function(url, data, callback) { 
    return jQuery.get(url, data, callback, "json"); 
}, // ... rest of jQuery core 

Así que debe haber alguna otra cosa impedir la devolución de llamada de disparar ...

Me gustaría empezar por ** alert ** ing cosas diferentes (no solo 'hola') en cada devolución de llamada, de esa manera usted sabe cuál está fallando/teniendo éxito.

0

Como se ha mencionado por muchos otros, es necesario JSON válida (es decir, cumple con las normas en http://json.org/) para getJSON para trabajar (esto significa que no se puede conseguir a través de HTML getJSON como en el ejemplo).

La razón por la que la última prueba funciona es porque el último parámetro "json" no se interpreta como el "tipo". Debido a que el siguiente no funciona:

$("#test3").click(function() { 
    $.get("index.html", 
     '', 
     function(response) { 
       alert('hi'); 
       //works 
     }, 
     "json" 
    ) 
}); 
0

que tenía el mismo problema a pesar de haber formado así JSON, etc. Pude consultar mi servicio web, y obtener una respuesta, sin embargo, mi función de devolución de llamada no estaba disparando. Después de buscar en la red, la mayoría de los interwebers sugirieron usar 'jsonp', lo cual hice ya que mi aplicación realiza algunas llamadas de dominio cruzado, y también agregué 'callback'. a mi url Esto no funcionó, pero eso, incluyendo la devolución de llamada con el JSON devuelto, resolvió mi problema. El código siguiente se explica lo que quiero decir:

//server side json formed somewhere up here 
String data = callback + "("+ json +")" ; 

la respuesta resultante de esto es algo así como "jsonp1280403476086([{"Name":"Jack Sparrow" cuales jQuery parecía no tener un problema y por lo que nunca se me murió.

Espero que esto ayude.

4

$ .getJSON() es JSONP, por lo que cambiar de esta manera:

$("#test2").click(function() { 
    $.getJSON("index.html?callback=?", 
     function(response) { 
       alert('hi'); 
     } 
    ) 
}); 

Server recibe devolución de llamada parámetro llena con algo como: jsonp1291077863309. En una respuesta, escriba la función de devolución de llamada jsonp1291077863309 (PUT_JSON_HERE).

0

Uso $.post en lugar de $.getJSON(), en MVC2 si está utilizando o $.getJSON$.get Asegúrese de ajustar JsonRequestBehavior a AllowGet. De lo contrario, se devolverá un error HTML que hace que su solicitud no active la devolución de llamada.

3

Derecho! Después de 2 días de enloquecer tratando de hacer que $.getJSON aceptara una cadena JSon bien formada del servidor, ¡el problema realmente estaba en el servidor! Al igual que Carl_Platt dice, debe anteponer el valor de devolución de llamada recibido como un parámetro url a la salida json ($_GET['callback'] en PHP). Eso se llama "salida JSON-P", solo en caso de que quiera google al respecto.

manos, aquí una página donde se muestran la solución en PHP:

http://1080d.com/lang/en-us/2009/10/converting-php-to-jsonp-with-json_encode/

Y recuerda (muy importante) para añadir a la url se llama el parámetro callback=?! (Solo es necesario si la url a la que llama no está en el mismo servidor que sirve para ejecutar la secuencia de comandos de jquery) ...

JQuery reemplazará automáticamente '?' con un valor conveniente antes de enviarlo al servidor. No necesita preocuparse por qué valor se utiliza, todo será perfecto para usted (¡si el servidor hace el trabajo correcto!) Y ese fue el problema en mi caso!) :-)

Espero que ayude!

+0

¡Muchas gracias! Afortunadamente para mí no he estado intentando durante un par de días, pero al menos un par de horas, y esto fue EXACTAMENTE lo que tenía que hacer para solucionarlo. – Tarka

0

Asegúrate de no tener [HttpPost] listado arriba del método JsonResult en tu controlador. Esto no devolverá datos a una llamada .getJSON.

Cuestiones relacionadas