2012-02-24 33 views
6

ile birlikte 200 değerini döndürüyor. Önbellek bildirimi ile bir HTML5 test web sayfası test.html var. Web sayfası, aynı sunucuya, önbellek bildiriminde NETWORK: bölümünün altında listelenen bir do_get_data.php web sayfasına bir Ajax isteği gönderir.Ajax isteği gerçekleştirilemedi ve sunucu veri

İstek, hem Firefox 10 hem de iPhone iOS 5 Safari tarafından gerçekleştirilir (bu, PHP betiği do_get_data.php hizmetinde kaydedilir). Firefox 10, 10 saniye sonra success geri arama işlevini çağırır, yani sunucudan veriler döndüğünde. Bununla birlikte, iPhone iOS 5 Safari, isteği başlattıktan hemen sonra fail geri arama işlevini çağırır ve success geri arama işlevini çağırmaz.

iPhone iOS 5 Safari için, textStatuserror ve JSON.stringify(jqXHR), {"readyState":0,"responseText":"","status":0,"statusText":"error"} şeklindedir.

isteği test.html aşağıdaki kodu kullanılarak gerçekleştirilir: Referans olarak

<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" /> 

, do_get_data.php şuna benzer:

<?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

Uykuyu kaldırırsanız ne olur (10)? –

+0

Ve sunucu tarafında Safari'den başarılı istekleri gösteren bir günlüğünüz olduğunu doğru bir şekilde anlıyor musunuz? –

+0

@asaddude Uykuyu kaldırsam bile (10) durum aynı. Evet, sunucu tarafındaki günlük Safari'yi gösterir. – AndersTornkvist

cevap

1

Ne

için $.ajax çağrı değiştirirseniz
$.ajax({ 
    url: testurl, 
    cache: false, 
    type: "GET", 
    data: senddata 
}).then(
    function(result) { test_ok(result); }, 
    function(result) { testFail(result); } 
); 
+0

Cevabınız için teşekkür ederiz. Ne yazık ki, bu sorunu çözmez. Yine de bir istekle sonuçlanır, ancak 'testFail()' denir. – AndersTornkvist

+0

İçerik Türü üstbilgisini PHP kodunuzdan kaldırırsanız ne olur? Belki de Safari bununla ilgili bir sorun yaşıyor. Yazdığım tüm AJAX kodlarında, asla bir Content-Type üstbilgisi koymadım. Ben sadece düz metni ekliyorum. – SenorAmor

2

Anladığım kadarıyla, durum kodu 0'ın nedenleri (1) file://, (2) ulaşılamaz ağ kaynağı ve (3) çapraz etki alanı ilkesidir. PHP'yi yüklediğinizden, 1 numarayı güvenli bir şekilde yönetebiliriz ve sunucunuz Safari'yi de kaydeder. Aynı zamanda bizi 2 ile birlikte bırakır. Yukarıdaki kodların hepsi aynı alanda mı oturur? Değilse, etki alanı isteklerine izin vermek için PHP'de Access-Control-Allow-Origin HTTP üstbilgisini kullanın.

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

Ayrıca, emin olun, düğme girişi tıklama sadece onclick değil (yani iOS'ta ne olursa olsun) diğer herhangi bir varsayılan davranış gerçekleştirir. onclick işleyicisinden false dönen engellemek olacaktır:

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

GÜNCELLEME: Her zaman basitçe dışına onun belki arabası uygulanmasını taşımak için apaçık önbelleği devre dışı bırakabilir Son çare olarak

.

+0

Cevabınız için çok teşekkür ederim. Sebebini beğendim. Teorik olarak, bir çapraz etki alanı politikası sorunu olabileceğini kabul ediyorum. Ancak, aynı alanda. 'http: //' URL için bile kullanılmaz, ancak herhangi bir alan adı olmadan 'do_get_data.php' yerine. Bu sorunu ayıklamanın iyi bir yolu var mı? Geri dönen yanlış aslında hiçbir şeyi değiştirmedi. – AndersTornkvist

+0

Ne yazık ki, hata ayıklama tesisleri iOS ve genel olarak mobil cihazlarda çok fakirdir ... Araştırmamı yaparken de, göreceli yolun neden olarak tanımlandığı ilgili ifadelere de rastladım. Mutlak URL yolunu denediniz mi? Ve açıklığa kavuşturmak için - önbellek bildirimi olmadan sorun devam ediyor mu? –

+0

http: // 'dahil olmak üzere bir mutlak URL kullanmak sorunu çözmedi. – AndersTornkvist

1

iOS altında sitenizi çalıştıran, ne kadar emin ancak bildiride dosyaları kullanırken jQuery ve AJAX istekleri ile ilgili bir sorun oldu değil: Zaten tezahür ait AĞ bölümünde kaynak listeleme rağmen http://bugs.jquery.com/ticket/8412

, diğer geçici çözümü dışarı denemenizi öneririz orada listelenen:

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

Sorun hakkında yeni düşünceleriniz için teşekkür ederiz. Biliyorum ki bilet aslında doğru içeriği geri getiriyor, ki bu benim için geçerli değil. Bu istek aslında sunucuya canlı olarak yapılır. 'IsLocal: true' ile çalıştım ama maalesef bu sorunu çözmedi. Aynı hata var. – AndersTornkvist

2

bir süre bu mücadele ve cevap hata raporu cevapları vardı:

kullanım

NETWORK: çok ajax isteği önbelleğe önlemek için apaçık önbellekte *

.