首页 文章

Android WebView AJAX本地文件

提问于
浏览
10

我有一个android webview加载我在我的资产本地的网站 . 我自己没有构建它,而且我对标记,js等几乎无法控制 .

问题:网站的某些部分使用jquery $ .ajax-gets来获取HTML以显示模式,我想我遇到了跨域问题(如果我在桌面上本地测试该网站,我得到同源-warnings,我的来源是“null”),即由于某种原因,本地js不能ajax-获取assets文件夹中的其他本地文件,因为底层浏览器认为这些来自不同的来源 . 我已经阅读了关于此事的任何事情,似乎没有任何区别 . 在LogCat中没有收到任何错误或警告 .

这是在Nexus 7上运行的,文件位于assets文件夹( file:///android_asset )中 . 其他一切都很好,但是没有运气的ajax GET .

从清单:

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

相关的webview代码:

mWebView = (WebView) findViewById(R.id.webview);
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setSupportMultipleWindows(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
mWebView.addJavascriptInterface(this, "android");
if (savedInstanceState != null) {  
    mWebView.restoreState(savedInstanceState);
} else {          
    mWebView.loadUrl("file:///android_asset/site/index.html");
}

这是相关的js:

var load = function ( source, callback, dontShowLoader ) {
if( !dontShowLoader ) {
    loading( 'show' );
}
$.ajax({
    url: source,
    type: 'GET',
    data: {
        campaign: true
    },
    success: function ( data ) {
        var $data = $(data);
        loading( 'hide' );
        $data.data( 'url', source );
        callback( $(data) );
    }
});
};

我在这里错过了什么吗?真的没办法在本地文件内容上做ajax GET吗?请注意,我只使用本地文件,正常用例是平板电脑在使用应用程序时未连接到互联网,因此任何外部呼叫都是禁止的 .

2 回答

  • 2

    您需要允许跨域 . 在此示例中,允许跨域使用json值和脚本 .

    $.ajaxPrefilter( "json script", function( options ) {
        options.crossDomain = true;
    });
    
  • 6

    谢谢你回答@ njzk2,我做到了:

    $.ajaxPrefilter( 'text', function( options ) { options.crossDomain = true; }); 
    $.ajax({ url: source, type: 'GET', dataType: 'text'
    

    使它在firefox,chrome和IE中工作以加载本地文件(而不是通过任何服务器)

    我个人缺乏这个至少以api 16为目标的参数(想知道是否有任何其他参数可以针对任何旧的API)

    mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
    

    谢谢

相关问题