问题
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:// 网址不允许使用 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";
启用 Cookie
确保设备保留 cookie 的简单功能。
CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().sync();
创建用于日志记录的 chrome 客户端
记录所有消息 [两次] 并在页面加载完成时执行一个功能。这实际上效果很好。添加更多 [remote] 脚本标签会延迟执行。
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