Android webview不会从脚本src执行javascript

Der*_*Jan 5 javascript android adk android-webview

问题

webview实际上并不执行从远程位置通过src加载的脚本

检查并仔细检查

  • 许可: <uses-permission android:name="android.permission.INTERNET" />

  • 该文件http://localhost/android/test.js存在

  • view.getSettings().setJavaScriptEnabled(true);在加载URL之前调用它

代码

鉴于a WebView view和aContext context

建立一个文件

它需要cookie,因此需要动态构建它.file:// urls不允许使用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";
Run Code Online (Sandbox Code Playgroud)

已启用Cookie

简单的功能,以确保设备保留cookie.

CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().sync();
Run Code Online (Sandbox Code Playgroud)

创建用于记录的chrome客户端

记录所有消息[两次],当页面完成后,加载执行一个功能.这实际上运作良好.添加更多[远程]脚本标记会延迟执行.

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();
            }
        }

    };
Run Code Online (Sandbox Code Playgroud)

加载视图

连接chrome客户端,启用javascript,添加界面并开始加载!

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

界面

界面如下所示

public class JSInterface{

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

我实际上可以通过调用来测试javascript和界面

view.loadUrl("javascript:bridge.result( 0, 'TESTING INTERFACE' );");
Run Code Online (Sandbox Code Playgroud)

只要这被推迟到加载完成后(例如在execute function此工作正常.并且消息被记录.

test.js脚本里面

一个非常简单的脚本

console.log( 'test loaded' );
var test = function() { console.log( 'test' ); bridge.result( 1, 'res' ); }
Run Code Online (Sandbox Code Playgroud)

为什么不起作用?

  • 我没有看到test loaded日志,应该被客户端捕获

  • 当我打电话给view.loadUrl("javascript:console.log(test)test is not defined