2012-02-24 13 views
6

Tengo una página web de prueba HTML5 test.html con un manifiesto de caché. La página web realiza una solicitud de Ajax al mismo servidor, a una página web do_get_data.php que se enumera en la sección NETWORK: en el manifiesto de caché.Falló la devolución de llamada llamada aunque se realiza la solicitud Ajax y el servidor devuelve 200 con datos

La solicitud se realiza tanto en Firefox 10 como en iPhone iOS 5 Safari (esto se registra en el script PHP de servicio do_get_data.php). Firefox 10 llama a la función de devolución de llamada success después de 10 segundos, es decir, cuando se devuelven los datos del servidor. Sin embargo, mi iPhone iOS 5 Safari llama a la función de devolución de llamada fail inmediatamente después de que inició la solicitud y no llama a la función de devolución de llamada success.

Para iPhone iOS 5 Safari, textStatus es error y JSON.stringify(jqXHR) es {"readyState":0,"responseText":"","status":0,"statusText":"error"}.

La solicitud se realiza utilizando el siguiente código en test.html:

<script type="text/javascript"> 
    function test_ok(data) { 
     alert('Test OK, data: ' + JSON.stringify(data)); 
    } 
    function testFail(jqXHR, textStatus) { 
     alert(textStatus + ' | ' + JSON.stringify(jqXHR)); 
    } 
    function get_data(testurl) { 
     var senddata, request; 
     alert('Request for ' + testurl + ' started.'); 
     window.testid = new Date().getTime(); 
     senddata = { 
      background: true, 
      requestId: window.testid 
     }; 
     request = $.ajax({ 
      url: testurl, 
      cache: false, 
      type: "GET", 
      data: senddata, 
      success: test_ok 
     }); 
     request.fail(testFail); 
    } 
</script> 
<input type="button" onclick="get_data('do_get_data.php')" value="test sending" /> 

Como referencia, do_get_data.php se parece a esto:

<?php 
    $id = md5(rand() . rand()); 
    trigger_error(implode("\t", array('start', $id, $_SERVER['REQUEST_URI'], $_SERVER['REMOTE_ADDR'], $_SERVER['USER_AGENT'])); 
    sleep(10); 
    header('Content-Type: application/json'); 
    $json = json_encode(array('msg'=>'Test was OK')); 
    trigger_error(implode("\t", array('echo', $id, $json)); 
    echo $json; 
?> 
+0

¿Qué sucede si elimina el sueño (10)? –

+0

¿Y entiendo correctamente que tiene un registro que muestra las solicitudes exitosas de Safari en el lado del servidor? –

+0

@asaddude Incluso si elimino el sueño (10), la situación es la misma. Sí, el registro en el lado del servidor muestra Safari. – AndersTornkvist

Respuesta

1

Lo que si cambia su llamada $.ajax a

$.ajax({ 
    url: testurl, 
    cache: false, 
    type: "GET", 
    data: senddata 
}).then(
    function(result) { test_ok(result); }, 
    function(result) { testFail(result); } 
); 
+0

Gracias por su respuesta. Desafortunadamente, esto no resuelve el problema. Todavía resulta en una solicitud, pero se llama a 'testFail()'. – AndersTornkvist

+0

¿Qué sucede si elimina el encabezado Content-Type en su código PHP? Quizás Safari está teniendo un problema con eso. En todo el código AJAX que he escrito, nunca he configurado un encabezado Content-Type. Me acabo de repetir el texto simple. – SenorAmor

2

Me han dado a entender que las causas del código de estado 0 son (1) cargando desde file://, (2) recurso de red inalcanzable y (3) política de dominio cruzado. Dado que carga PHP, podemos con seguridad gobernar el número 1 y dado que su servidor registra también a Safari también el número 2, lo que nos deja con 3. ¿Se encuentra todo el código anterior en el mismo dominio? De lo contrario, utilice el encabezado HTTP Access-Control-Allow-Origin en PHP para permitir solicitudes de dominios cruzados.

header('Access-Control-Allow-Origin: http://example.org') 

Además, debe asegurarse de que, el clic en el botón de entrada se efectúa solamente la onclick y no cualquier otro comportamiento por defecto (sea lo que sea en el IOS). Volviendo false desde el controlador onclick impediría que:

<input type="button" onclick="get_data('do_get_data.php'); return false" ... /> 

ACTUALIZACIÓN:

Como último recurso, siempre se puede simplemente desactivar el manifiesto de caché para mover su aplicación quizá con errores fuera del camino.

+0

Muchas gracias por su respuesta. Me gusta tu razonamiento Teóricamente, acepto que podría ser un problema de política entre dominios. Sin embargo, está en el mismo dominio. 'http: //' ni siquiera se usa para la URL, sino 'do_get_data.php' sin ningún nombre de dominio. ¿Hay una buena manera de solucionar este problema? Volverse falso no cambió nada. – AndersTornkvist

+0

Lamentablemente, las instalaciones de depuración son muy pobres en iOS y dispositivos móviles en general ... Al hacer mi investigación, también tropecé con menciones relacionadas, donde se identificó la ruta relativa como la causa. ¿Has probado la ruta de URL absoluta? Y para aclarar: ¿el problema persiste sin el manifiesto de caché? –

+0

El uso de una URL absoluta que incluye 'http: //' no resolvió el problema. – AndersTornkvist

1

No estoy seguro de cómo está funcionando su sitio bajo iOS, pero ha habido un problema con las solicitudes de jQuery y AJAX durante el uso de los archivos de manifiesto: http://bugs.jquery.com/ticket/8412

A pesar de que ya está enumerando el recurso en la sección Red del manifiesto, yo sugeriría probar la otra solución que allí se indican:

jQuery.ajaxSetup({ 
    isLocal: true 
}); 
+0

Gracias por nuevas ideas sobre el problema. Parece que el ticket realmente devuelve el contenido correcto, que no es el caso para mí. La solicitud se realiza en vivo en el servidor. Intenté con 'isLocal: true' pero desafortunadamente esto no resolvió el problema. El mismo error existe. – AndersTornkvist

2

he luchado con esto durante un tiempo y la respuesta fue en el informe de error respuestas:

uso

RED: *

en el manifiesto de caché para evitar el almacenamiento en caché de la petición Ajax también.

Cuestiones relacionadas