参考链接:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/
昨天遇到一个问题: webview 无法调用 Js 的代码。真的是恶心的。
WebView 无法与 JS 交互。
在网络上搜了很久,我觉的还是相信自己的技术吧。别太相信百度了。Google 只是会给你一些建议啥的。但是每一个人的问题 有可能都是不一样的。
1 JS 无法调用我的代码?
注意的当Js 页面调用Android 的方法的时候:
window.android.reCal();
例如:
$('body').css('overflow','hidden'); window.android.calculate(); //这里调用你的方法});
private void setWebViewJsInterface() { if(null == webViewJSInterface){ webViewJSInterface = new WebViewJSInterface(this); webViewJSInterface.setmWebViewJSCallBack(this); } mWebviewCalculator.addJavascriptInterface(webViewJSInterface, "android");}
这是因为,在给webview.addJavascriptInterface() 的时候,这里注意一下判断。
再就是: WebViewJSInterface 中的方法注意:
/** * 点击计算 */@JavascriptInterfacepublic void calculate(){ mWebViewJSCallBack.JSCallBack("calculate");}
Google 官网说 有的时候 没有调用是因为 JS 没有加载完成,细细想想也有可能
解决方案:
mWebviewCalculator.setWebChromeClient(new WebChromeClient(){ @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg); } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } });
重写onJsAlert() 的方法。
解决;
2 但是当你去掉用页面的JS 的方法的时候,这个时候比较难找。因为 Js 本身的代码规范性就很有问题。所以,这个时候 你需要 前台的工程师的帮助。如果 是我自己的话,估计我得整个一两天了!
我昨天无法调用的问题: 因为JS 定义的function 是局部方法,所以调用一次之后消亡了。所以,无法调用。 解决方案:
window.reCal = function(){ result.css('left','200%'); result[0].scrollTop = 0; $('body').css({'overflow-x':'hidden','overflow-y':'auto'}); window.android.reCal();}
将方法提升到 window 的全局变量,这个时候再去调用的时候就没有问题了!
JS 的问题比较那解决,因为问题的定位本身就是很困难的!
友情提示:
1 给webview 添加了 js 的回调之后,注意代码的混淆。
2 WebViewJSInterface
她的处理方法,不要放在主线程,中会有问题。 建议使用子线程。我很喜欢使用 回调+ Handler 的方式处理!
我的Github:
Hades Webveiw 整理 code
No comments:
Post a Comment