一些Android设备上可以使用Ajax,但其他设备则不行。

3
[LATER EDIT: 我发现问题与Android版本有关,而不是设备类型。所以我的代码适用于Android 4.0及以下版本,但不适用于更高版本。修复方法在答案中。]
我浪费了至少两天的时间来解决这个问题。我将几个网页打包成一个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(以及Samsung 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>
2个回答

5
我找到了我需要的内容。Android 4.1和4.2引入了新的方法:getAllowUniversalAccessFromFileURLs。
由于它在API 16以下不起作用,因此解决方案需要添加一些额外的代码行,以确保这个不存在的方法不会在之前的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 GET返回了什么吗?它是返回DOM文档! 而你试图将文档设置为你的#result HTML! 如果你看一下http://api.jquery.com/jQuery.get/,你会发现你的success函数有三个参数:
success:function(data, textStatus, jqXHR){}

现在您可以选择如何获取您的HTML并将其显示到 $(“#result”)中。

$("#result").html(jqXHR.responseText);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接