Android WebView не выполняет JavaScript из сценария SRC

Эта проблема

Webview фактически не выполняет скрипты, загруженные через src из удаленного местоположения.

Проверено и дважды проверено

  • Разрешение: <uses-permission android:name="android.permission.INTERNET" />

  • Что файл http://localhost/android/test.js существует

  • Что это называется view.getSettings().setJavaScriptEnabled(true); перед загрузкой URL

Код

Учитывая WebView view и Context context

Создание документа

Для этого понадобятся файлы cookie, поэтому необходимо его динамически создавать. file:// URL не разрешают использование файлов cookie. В любом случае, это "должно" работать просто отлично.

String html =
        "<html>\n" +
        "<head>\n" +
        "</head>\n" +
        "<body>\n" +
        "<script src=\"http://localhost/android/test.js\"  type=\"text/javascript\"></script>\n" +
        "</body>\n" +
        "</html>";
String mime = "text/html";
String encoding = "utf-8";

Cookies включены

Простые функции, чтобы убедиться, что устройство сохраняет куки.

CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().sync();

Создание клиента Chrome для регистрации

Регистрация всех сообщений [дважды] и после загрузки страницы выполнить функцию. Это на самом деле хорошо работает. Добавление дополнительных тегов [remote] script задерживает выполнение.

WebChromeClient client = new WebChromeClient ( ) {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            Log.e( "JSINTERFACE", consoleMessage.message() );
            return super.onConsoleMessage(consoleMessage);
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            loadingFinished = ( newProgress == 100 );
            Log.d( "JSINTERFACE", "Progress is:" + newProgress );
            if ( loadingFinished ) {
                Log.i( "JSINTERFACE", "Finished loading webclient" );
                execute();
            }
        }

    };

Загрузка представления

Присоедините клиент Chrome, включите JavaScript, добавьте интерфейс и начните загрузку!

view.setWebChromeClient( client );
view.getSettings().setJavaScriptEnabled(true);
view.addJavascriptInterface( new JSInterface(), "bridge" );
view.loadDataWithBaseURL( "http://localhost/android/", html, mime, encoding, null );

Интерфейс

Интерфейс выглядит следующим образом

public class JSInterface{

    @JavascriptInterface
    public void result( int success, String message ) {
        Log.i( "JSINTERFACE", message );
        // TODO handler
    }
}

Я могу на самом деле проверить Javascript и интерфейс, позвонив

view.loadUrl("javascript:bridge.result( 0, 'TESTING INTERFACE' );");

Пока это откладывается до завершения загрузки (например, в execute function это отлично работает И сообщение зарегистрировано.

Внутри test.js скрипт

Очень простой скрипт

console.log( 'test loaded' );
var test = function() { console.log( 'test' ); bridge.result( 1, 'res' ); }

Почему это не работает?

  • Я не вижу test loaded журнал, должен быть захвачен клиентом

  • Когда я звоню view.loadUrl("javascript:console.log(test) я получил test is not defined

0 ответов

Другие вопросы по тегам