2013-01-25 26 views
6

chúng tôi đang gặp sự cố với trình duyệt được tích hợp sẵn trên Android 4.0, 4.1 và 4.2 (chúng tôi chưa có bất kỳ thứ gì thấp hơn để kiểm tra). Vấn đề là cuộc gọi ajax sẽ hoạt động hoàn hảo trên lần tải đầu tiên, bạn có thể nhấn nút Ajax chạy nhiều lần tùy ý và nó sẽ ổn. Bạn có thể ngắt kết nối Internet và nó sẽ hoạt động bình thường. Nhưng nếu bạn thoát (HOÀN TOÀN, hãy chắc chắn rằng nó không chỉ chạy trong nền) trình duyệt sau đó khởi động lại nó, nó sẽ không tải và bấm nút. Nó không quan trọng nếu bạn đang trực tuyến hoặc off-line. Lỗi được trả về từ cuộc gọi ajax là "Lỗi" với trạng thái = 0 và readyState = 0.
Khi thành công, bạn nhận được thông báo trả lời "hô hấp từ cuộc gọi Ajax" với trạng thái = 200 và readyState = 4.Vấn đề trình duyệt Android với jQuery Ajax và khi appcache được sử dụng

Mã hoạt động trên mọi trình duyệt khác mà chúng tôi đã thử nghiệm trên Android Chrome, Firefox và Opera. trên iOS 5 và 6, nó hoạt động và mọi trình duyệt trên máy tính để bàn mà chúng tôi có thể tìm thấy. Có điều gì đó mà tôi bị thiếu hoặc chúng tôi đã tìm thấy lỗi trong trình duyệt được tích hợp sẵn. Bất kỳ trợ giúp về điều này sẽ được đánh giá cao đặc biệt là nếu nó chỉ là một cái gì đó ngu ngốc tôi đã làm.

Chúng tôi đã tạo một kịch bản thử nghiệm thể hiện vấn đề này tốt Tôi đã đính kèm nó vào cuối thư này.

Cảm ơn

Tim

test.php

<?php  
function displayPage() { 
?> 
<!DOCTYPE html> 
<html manifest="test.manifest" debug="true"> 
    <head> 
     <meta name="viewport" content="width=device-width, initial-scale=1" > 
     <title>test</title> 
     <script type="text/javascript" src="jquery-1.9.0.min.js"></script> 
     <script type="text/javascript"> 
      function runAjaxGet() { 
       var XMLHttpRequest = $.ajax({ 
        url: "test.php", 
        dataType: "json", 
        data: "test=test", 
        traditional: "true", 
        success: function(responseData) { 
         alert('good\n responseData: '+responseData+ '\n res:' + XMLHttpRequest.responseText +'\n readyState: '+ XMLHttpRequest.readyState + '\n Status: '+XMLHttpRequest.status); 
         console.log(XMLHttpRequest); 
        }, 
        error: function (xhr, ajaxOptions, thrownError, responseData) { 
         alert('bad\n responseData: '+responseData+ '\n res:' + XMLHttpRequest.responseText +'\n readyState: '+ XMLHttpRequest.readyState + '\n Status: '+XMLHttpRequest.status); 
         console.log(XMLHttpRequest); 
        } 
       }); 
      } 
      $(document).ready(function() { 
       runAjaxGet(); 
      }); 

     </script> 
    </head> 
    <body> 
     <button Name="Run Ajax" onclick="runAjaxGet();">Run Ajax</button> 
    </body> 
</html> 
<?php 
} 

function processRequests() { 
    header("Content-Type: application/json; charset=UTF-8"); 
    echo (json_encode("respose from Ajax Call")); 
} 

date_default_timezone_set ("UTC"); 

if (isset($_REQUEST['test'])) { 
    $which = $_REQUEST['test']; 
} else { 
    $which = ''; 
} 

switch ($which) { 
    case "test": 
     processRequests(); 
     break; 

    default : 
     displayPage(); 
     break; 
} 
?> 

test.manifest

CACHE MANIFEST 
test.php 
jquery-1.9.0.min.js 
test.php?test=test 

Trả lời

0

Chỉ cần thêm phần NETWORK với dấu hoa thị và nó sẽ làm việc

CACHE MANIFEST 
test.php 
jquery-1.9.0.min.js 
test.php?test=test 
NETWORK: 
* 
0

Tôi nhấn cùng một vấn đề này và xác định rằng khi được truy xuất từ ​​bộ nhớ cache, 0 cho biết thành công. Điều này có thể do không có yêu cầu http thực sự nào liên quan kể từ khi yêu cầu được giải quyết hoàn toàn cục bộ.

AppCache file manifest:

CACHE MANIFEST 

CACHE: 
/config 

Javascript:

var request = new XMLHttpRequest(); 
request.open('GET', '/config', false); // async=false is ok because this file will always come from AppCache 
request.send(null); 

// Older versions of android return 0 when ajax request retrieved from appcache 
if (request.status == 200 || request.status == 0) { 
    return JSON.parse(request.responseText); 
} else { 
    console.log("ERROR: config not retrievable"); 
    throw "Attempt to retrieve config return http status " + request.status; 
}