2013-01-07 41 views
3

[編輯:我發現,問題與Android版本,而不是設備類型有關。所以我的代碼在Android 4.0之前是完美的,而不是上面。修復是在答案。]阿賈克斯在一些Android設備上工作,而不是在其他

我浪費了至少2天這個問題。我有幾個網頁作爲Android應用程序打包。並且可以在瀏覽器和我的Android設備(包括Galaxy Tab 2)上完美工作。但不適用於Nexus。我沒有它,所以我一直在做APK和一個朋友測試。錯誤發生在AJAX上。相同的代碼適合我,不適合他(和其他人,我不知道他們的設備)。

下面是我使用的小測試。正如你所看到的,它沒有錯誤(這是我的猜測)。爲什麼不適用於所有Android設備?我提到我已經使用Eclipse和Build.PhoneGap.com編譯了此代碼(其他引用的文件位於http://jumpshare.com/b/57O6tH)。然而,同樣的結果:我得到的APK正在使用某些設備,而不是其他設備。使用* file:///android_asset/www/import.html*沒有幫助我。錯誤是404,因爲該文件不存在。但它是!

錯誤在哪裏?它讓我瘋狂 :)。爲什麼這段代碼在瀏覽器和我的Galaxy Tab 2(以及三星Gio上)上的APK可以正常工作,但不能在Nexus(和其他設備)上運行?

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Test</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1">  
    <link href="jquery.mobile-1.2.0.min.css" rel="stylesheet"/> 
    <script src="jquery-1.8.3.min.js" type='text/javascript'></script> 
    <script src="jquery.mobile-1.2.0.min.js" type='text/javascript'></script> 
    <script type='text/javascript'> 
    //$(document).ready(function() { 
    $(document).bind("pageinit", function(){ 
     $("#buton").bind('click',function(){ 
      $.mobile.showPageLoadingMsg(); 
      $.ajax({ 
       url:'import.html', 
       datatype:'html', 
       type: 'GET', 
       success:function(html){ 
        $.mobile.hidePageLoadingMsg(); 
        $("#result").html(html); 
       }, 
       error: function(jqXHR, textStatus, errorThrown) { 
        $("#result").html("ERRORS:"+errorThrown+"<hr>"+textStatus+"<hr>"+JSON.stringify(jqXHR)) 
        $.mobile.hidePageLoadingMsg(); 
        alert('Not working!!!'); 
       } 
      }) 
     }); 
    }); 
    </script> 
</head> 
<body> 
    <!-- Pagina de start --> 
    <div data-role="page" id="start"> 
     <div data-role="header" data-theme="b"> 
      <h1>Test</h1> 
     </div> 
     <div data-role="content"> 
      <button id="buton">AJAX!</button> 
      <div id="result"></div> 
     </div> 
    </div> 
</body> 
</html> 

回答

4

我找到了我需要的東西。 Android 4.1和4.2引入了這種新方法:getAllowUniversalAccessFromFileURLs

由於它不適用於低於16的API,因此解決方案需要更多的幾行,以確保這種不存在的方法不會導致以前API中的錯誤。

public class MainActivity extends Activity { 
/** Called when the activity is first created. */ 
WebView webView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    webView = (WebView) findViewById(R.id.webView); 
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    webView.getSettings().setJavaScriptEnabled(true); 
    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN){ 
     fixNewAndroid(webView); 
    } 
    webView.setWebChromeClient(new WebChromeClient()); 
    webView.loadUrl("file:///android_asset/www/index.html"); 
} 

@TargetApi(16) 
protected void fixNewAndroid(WebView webView) { 
    try { 
     webView.getSettings().setAllowUniversalAccessFromFileURLs(true); 
    } catch(NullPointerException e) { 
    } 
} 

}

0

你檢查什麼返回你的Ajax得到什麼?這是返回DOM文檔! 你試圖爲你的#result html文檔設置! 如果你看一看上http://api.jquery.com/jQuery.get/你可以看到你的成功的功能有3個參數:

成功:功能(數據,textStatus,jqXHR){}

現在,你能怎麼選擇獲取你的html並將其顯示到$(「#result」)中。

$(「#result」)。html(jqXHR.responseText);