Локальные файлы Android WebView + AJAX

у меня есть android webview, загружающий веб-сайт, который у меня есть локально в моих активах. Я не построил его сам, и у меня очень мало контроля над разметкой, js и т. д.

проблема: части веб-сайта используют jQuery $.ajax-получает HTML для отображения в модальном режиме, и я думаю, что столкнулся с междоменной проблемой (если я тестирую сайт локально на своем рабочем столе, я получаю одинаковые предупреждения, мое происхождение "null"), т. е. по какой-то причине локальный js не может ajax-получить другие локальные файлы в папка assets, потому что базовый браузер считает, что они из разных источников. Я прочитал все, что смог достать по этому поводу, и, похоже, ничего не изменилось. Не получать никаких ошибок или предупреждений в LogCat.

это работает на Nexus 7, файлы находятся в папке Assets (file:///android_asset). Все остальное работает нормально,но не повезло с ajax.

из манифеста:

<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 над локальным содержимым файла? Заметьте, что я только есть локальные файлы для работы, нормальный случай использования заключается в том, что планшет не подключен к интернету при использовании приложения, поэтому любые внешние вызовы не идут.

2 ответов


вам нужно разрешить crossdomain. В этом примере crossdomain разрешен для значений json и скриптов.

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

Спасибо за ответ @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);

спасибо