我在服务器上托管了一些HTML5 / JavaScript文件.当在HTML5页面上单击按钮时,将调用JavaScript函数.我想在调用函数时监听并获取函数返回的Json.以前我在设备上打开一个端口,但这似乎不适用于Android 3.0.我听说你可以使用外部接口来收听JavaScript调用,但我不知道如何实现它.
解决方法:
要使用外部接口,您需要在WebVIEw中运行您的站点.以下解决方案暗示,什么
>你知道要拦截的所有函数名称,以及……
>这些函数属于Js代码的公共范围.
要注册接口,需要在WebVIEw实例上调用addJavascriptInterface方法.您需要为其选择一个名称并创建一个实现.你的界面应该拦截函数调用并报告它们的结果,所以,让我们来描述它……
class FunctionCallinterceptor { public voID reportCall(String functionname, String result) { // some code, handling interception }}
并注册它…
mWebVIEw.addJavaScriptInterface(new FunctionCallinterceptor(), 'Interceptor');
有关JavaScript界面的更多信息,请参阅Binding JavaScript
然后你需要将功能结果“传输”到你的界面…这里你需要一些JavaScript代码.
function wrapFunc(name) { if(typeof window[name] == 'function') { // If target is accessible var original = window['__' + name] = window[name]; // remember original one window[name] = function() { // and replace with wrapper var result = original.apply(this, arguments); // call original Interceptor.reportCall(name, result.toString()); // report to interceptor return result; // return result as usual } }}
要包装您的函数,请使用此代码
wrapFunc('myFunction'); // wraps myFunction in the source
此外,不要忘记启用JavaScript
mWebVIEw.getSettings().setJavaScriptEnabled(true);
何时,如何将此代码嵌入到您的外部页面(我暗示您无法访问外部Js代码)…要在页面上下文中执行任意代码,您可以使用WebVIEw的loadUrl方法
mWebVIEw.loadUrl('JavaScript:some... Js... code...');
这不会触发页面重新加载,只会执行JavaScript.请注意页面完全加载后需要执行的 *** 作.您可以通过以下代码获取:
mWebVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt { @OverrIDe public voID onPageFinished (WebVIEw vIEw, String url) { // here page is loaded }});
有关详细信息,请参见setWebViewClient和onPageFinished
另请注意,通过loadUrl调用传输到页面的代码不得包含换行符.所以你需要摆脱它们(通过String.replace左右).
加
所以,最终的解决方案是:
String wrapFuncCode = "function wrapFunc ...... "; // or maybe place it in resources?mWebVIEw.addJavaScriptInterface(new FunctionCallinterceptor(), 'Interceptor');mWebVIEw.getSettings().setJavaScriptEnabled(true);mWebVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt { @OverrIDe public voID onPageFinished (WebVIEw vIEw, String url) { // inject wrapper // don't forget to remove newline chars mWebVIEw.loadUrl("JavaScript:" + wrapFuncCode.replace('\n', '')); // wrap all the functions needed String[] funcToWrap = new String[] { 'myFunc1', ... }; for(String f : funcToWrap) { mWebVIEw.loadUrl("JavaScript:wrapFunc('" + f + "myFunction');"); } }});
总结 以上是内存溢出为你收集整理的从java – Android收听javascript函数调用全部内容,希望文章能够帮你解决从java – Android收听javascript函数调用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)