h5和原生结合开发app越来越流行。其实就是webview 的js调用native的方法。也就是需要搭建一个桥。这样的桥早就有人搭建好了,那就是jsbridge。

git地址:
https://github.com/lzyzsd/JsBridge.git

其实很简单,那些添加依赖我就不说了。

两种情况:
1.js调用本地的方法:

webView.loadUrl("http://testopen.cebbank.com/LifePayment/wap/apph5/index.html?uid=111&token=65F34B3203D893AD96173918C80C45B3&telno=16578915632&type=0&canal=yaoyaoshenghuo1&version=1.0.0&macValue=1167DA1CDF6379B94914C8CB5099542C");webView.registerHandler("wxpay", new BridgeHandler() {@Overridepublic void handler(String data, CallBackFunction function) {
//              Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();Gson gson = new GsonBuilder()
//        2013-09-14 16:45:29.setDateFormat("yyyy-MM-dd HH:mm:ss")
//                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();OrderModel ordermodel=gson.fromJson(data,OrderModel.class);requestWXPay(MainActivity.this,ordermodel);Log.i(TAG, "handler: "+ordermodel.getAppid());Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
//                function.onCallBack("submitFromWeb exe, response data 中文 from Java");}});

js里面这样写:

    //call native methodwindow.WebViewJavascriptBridge.callHandler('wxpay'//, {'param': '中文测试'}, data.orderModel, function(responseData) {<!--document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData-->});
  1. 本地给js发送消息, 调用网页的方法:
    本地这样写;
webView.callHandler("payResult", state, new CallBackFunction() {@Overridepublic void onCallBack(String data) {// TODO Auto-generated method stub
//              Log.i(TAG, "reponse data from js " + data);}});

js里面这样写:

function connectWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {callback(WebViewJavascriptBridge)} else {document.addEventListener('WebViewJavascriptBridgeReady', function() {callback(WebViewJavascriptBridge)},false);}}connectWebViewJavascriptBridge(function(bridge) {bridge.init(function(message, responseCallback) {console.log('JS got a message', message);var data = {'Javascript Responds': '测试中文!'};console.log('JS responding with', data);responseCallback(data);});bridge.registerHandler("payResult", function(data, responseCallback) {alert(data);document.getElementById("show").innerHTML = ("data from Java: = " + data);var responseData = "Javascript Says Right back aka!";responseCallback(responseData);});})

就是一句户,方法名称对的上就可以了。
我这里只是总结了一下,其他的基础东西,自己看githup.

使用jsbridge遇到ssl认证的网站,结果一片空白。也就是https开头的。比如银联支付的页面。那么一开始我就设置了一个处理的webview,

WebViewClient webviewclient=new WebViewClient(){@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {handler.proceed();}};webView.setWebViewClient(webviewclient);

后来,这个webview可以访问银联这种ssl认证的参数,但是不能响应js的调用了。
一直报错:

"Uncaught TypeError: Cannot call method 'callHandler' of undefined", source

我就知道jsbridge肯定自己设置了一个自己的webviewlicent,查看源码库,找到了:

package coma.github.lzyzsd.jsbridge;private void init() {this.setVerticalScrollBarEnabled(false);this.setHorizontalScrollBarEnabled(false);this.getSettings().setJavaScriptEnabled(true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {WebView.setWebContentsDebuggingEnabled(true);}this.setWebViewClient(generateBridgeWebViewClient());}protected BridgeWebViewClient generateBridgeWebViewClient() {return new BridgeWebViewClient(this);}

这里,然后这个BridgeWebViewClient我们需要重写,让他支持ssl:

package coma.github.lzyzsd.jsbridge;import android.graphics.Bitmap;
import android.net.http.SslError;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;/*** Created by bruce on 10/28/15.*/
public class BridgeWebViewClient extends WebViewClient {private BridgeWebView webView;public BridgeWebViewClient(BridgeWebView webView) {this.webView = webView;}@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {handler.proceed();}

ok,既可以使用js,也可以支持ssl。

JsBridge Uncaught TypeError: Cannot call method 'callHandler' of undefined, source相关推荐

  1. bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题

    这个问题主要是由于date对象不是字符串,不能使用 split 函数,简单处理一下,转换成字符串就可以解决问题: ++++++++++++++++++++++++ parseDate: functio ...

  2. chrome浏览器不能录音:Uncaught TypeError: Cannot read property ‘getUserMedia‘ of undefined解决方法

    Uncaught TypeError: Cannot read property 'getUserMedia' of undefined解决方法 javascript 打不开浏览器录音功能的问题解决方 ...

  3. jquery.dataTables.min.js: Uncaught TypeError: Cannot read property 'style' of undefined

    Jquery DataTable使用报这个错: jquery.dataTables.min.js: Uncaught TypeError: Cannot read property 'style' o ...

  4. bug之bootstrap switch Uncaught TypeError: Cannot read property 'apply' of undefined

    2019独角兽企业重金招聘Python工程师标准>>> <input type="checkbox" name="my-switch" ...

  5. Uncaught TypeError: Cannot read property ‘events‘ of undefined

    使用谷歌调试页面时,出现如下错误提示: Uncaught TypeError: Cannot read property 'events' of undefined 场景是这样的,我页面中有几个按钮, ...

  6. datatables插件AJAX请求数据报错Uncaught TypeError: Cannot read property ‘length‘ of undefined

    之前常用的表格插件是bootstraptable·,现在换了地方工作,这边用的是datatables.上午再看官网API,感觉写的不是很清晰很到位. 看到一篇博客写的很详细,收藏了.最全的jquery ...

  7. jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property ‘style‘ of undefined原因

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错: jquery.dataTables.min.js:62 Uncaught TypeError ...

  8. 小程序组件报错Uncaught TypeError: Cannot read property 'name' of undefined

    小程序组件报错Uncaught TypeError: Cannot read property 'name' of undefined Component({/*** 组件的属性列表*/propert ...

  9. laydate报Uncaught TypeError: Cannot read property 'appendChild' of undefined

    laydate Uncaught TypeError: Cannot read property 'appendChild' of undefined 我遇到这个错误之后是从两个方向解决的问题 出现了 ...

最新文章

  1. 《Unity 游戏案例开发大全》一6.5 游戏主场景
  2. paddle deepspeech v2 转 pytorch
  3. linux18.04下安装的jdk11.0.2
  4. CPU处理器架构和工作原理浅析
  5. 增强包_情暖冬至 饺子飘香——临沭县兴华学校冬至“趣味包饺子”比赛圆满结束...
  6. Android代码片段:设备信息
  7. 如何在hadoop中控制map的个数
  8. mysql返回yyyy mm dd_怎么把取出mysql数据库中的yyyy-MM-dd日期转成yyyy年MM月dd日格式...
  9. 明细表如何添加重量_关于Revit中明细表标准的导出及导入
  10. C#入门经典.第6版 源代码下载 百度云盘下载
  11. JavaScript 登录注册表单验证
  12. 大家一起学电脑之硬件版
  13. 计算机病毒防治教案,计算机病毒与防治教案
  14. DDD(Domain-Driven Design)《领域驱动设计》书籍
  15. 实例三十八:银行卡问题
  16. php 分词搜索 splitword
  17. python两个数组合并排序_合并Python中的排序数组
  18. 存储过程报错:Error converting data type varchar to bigint.
  19. Systemverilog中static、automatic区别
  20. windows10商店无法联网OneNote无法联网

热门文章

  1. 服务器智能监控软件,监控 监控系统 消防智能监控 智能监控软件
  2. linux动态库替换,不要使用 cp 替换正在使用中的Linux 动态库
  3. 0x80070003系统找不到指定路径_DeepFaceLab错误:DLL Load failed 找不到指定模块!
  4. screen投屏怎么用_Screen投屏没有声音如何解决?
  5. python 打包图标_Python打包成exe文件很难?一分钟即可学会,并添加图标!
  6. html设置页面大小_如何将Word文档页面大小设置为16开?
  7. enq: tt - contention_要签TT或伊巴卡?湖人要走一步大棋,大肆招揽老将,为老詹真拼...
  8. webpack 采坑(CleanWebpackPlugin 插件报错: CleanWebpackPlugin is not a constructor ;)
  9. 再谈docker基本命令
  10. 云时代看CRM如何引领企业成功?