JsBridge Uncaught TypeError: Cannot call method 'callHandler' of undefined, source
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-->});
- 本地给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相关推荐
- bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题
这个问题主要是由于date对象不是字符串,不能使用 split 函数,简单处理一下,转换成字符串就可以解决问题: ++++++++++++++++++++++++ parseDate: functio ...
- chrome浏览器不能录音:Uncaught TypeError: Cannot read property ‘getUserMedia‘ of undefined解决方法
Uncaught TypeError: Cannot read property 'getUserMedia' of undefined解决方法 javascript 打不开浏览器录音功能的问题解决方 ...
- 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 ...
- bug之bootstrap switch Uncaught TypeError: Cannot read property 'apply' of undefined
2019独角兽企业重金招聘Python工程师标准>>> <input type="checkbox" name="my-switch" ...
- Uncaught TypeError: Cannot read property ‘events‘ of undefined
使用谷歌调试页面时,出现如下错误提示: Uncaught TypeError: Cannot read property 'events' of undefined 场景是这样的,我页面中有几个按钮, ...
- datatables插件AJAX请求数据报错Uncaught TypeError: Cannot read property ‘length‘ of undefined
之前常用的表格插件是bootstraptable·,现在换了地方工作,这边用的是datatables.上午再看官网API,感觉写的不是很清晰很到位. 看到一篇博客写的很详细,收藏了.最全的jquery ...
- jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property ‘style‘ of undefined原因
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错: jquery.dataTables.min.js:62 Uncaught TypeError ...
- 小程序组件报错Uncaught TypeError: Cannot read property 'name' of undefined
小程序组件报错Uncaught TypeError: Cannot read property 'name' of undefined Component({/*** 组件的属性列表*/propert ...
- laydate报Uncaught TypeError: Cannot read property 'appendChild' of undefined
laydate Uncaught TypeError: Cannot read property 'appendChild' of undefined 我遇到这个错误之后是从两个方向解决的问题 出现了 ...
最新文章
- 《Unity 游戏案例开发大全》一6.5 游戏主场景
- paddle deepspeech v2 转 pytorch
- linux18.04下安装的jdk11.0.2
- CPU处理器架构和工作原理浅析
- 增强包_情暖冬至 饺子飘香——临沭县兴华学校冬至“趣味包饺子”比赛圆满结束...
- Android代码片段:设备信息
- 如何在hadoop中控制map的个数
- mysql返回yyyy mm dd_怎么把取出mysql数据库中的yyyy-MM-dd日期转成yyyy年MM月dd日格式...
- 明细表如何添加重量_关于Revit中明细表标准的导出及导入
- C#入门经典.第6版 源代码下载 百度云盘下载
- JavaScript 登录注册表单验证
- 大家一起学电脑之硬件版
- 计算机病毒防治教案,计算机病毒与防治教案
- DDD(Domain-Driven Design)《领域驱动设计》书籍
- 实例三十八:银行卡问题
- php 分词搜索 splitword
- python两个数组合并排序_合并Python中的排序数组
- 存储过程报错:Error converting data type varchar to bigint.
- Systemverilog中static、automatic区别
- windows10商店无法联网OneNote无法联网
热门文章
- 服务器智能监控软件,监控 监控系统 消防智能监控 智能监控软件
- linux动态库替换,不要使用 cp 替换正在使用中的Linux 动态库
- 0x80070003系统找不到指定路径_DeepFaceLab错误:DLL Load failed 找不到指定模块!
- screen投屏怎么用_Screen投屏没有声音如何解决?
- python 打包图标_Python打包成exe文件很难?一分钟即可学会,并添加图标!
- html设置页面大小_如何将Word文档页面大小设置为16开?
- enq: tt - contention_要签TT或伊巴卡?湖人要走一步大棋,大肆招揽老将,为老詹真拼...
- webpack 采坑(CleanWebpackPlugin 插件报错: CleanWebpackPlugin is not a constructor ;)
- 再谈docker基本命令
- 云时代看CRM如何引领企业成功?