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() {
@Override
public 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 method
window.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() {
@Override
public 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(){
@Override
public 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;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
ok,既可以使用js,也可以支持ssl。
JsBridge "Uncaught TypeError: Cannot call method 'callHandler' of undefined", source的更多相关文章
- “Uncaught TypeError: Cannot call method 'createChild' of undefined" 问题的解决
Uncaught TypeError: Cannot call method 'createChild' of undefined 我在使用Ext 4.1.1做grid.Panel,然后chrome爆 ...
- bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题
这个问题主要是由于date对象不是字符串,不能使用 split 函数,简单处理一下,转换成字符串就可以解决问题: ++++++++++++++++++++++++ parseDate: functio ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- Uncaught TypeError: Cannot read property 'msie' of undefined
因为图方便,抄了别人写的一个jquerry插件,运行时“var pos = ($.browser.msie && parseInt($.browser.version) <= 6 ...
- easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
easyui使用时出现这个Uncaught TypeError: Cannot read property 'nodeName' of undefined 最后检查发现是必须给select一个id,光 ...
- reactjs Uncaught TypeError: Cannot read property 'location' of undefined
reactjs Uncaught TypeError: Cannot read property 'location' of undefined reactjs 路由配置 怎么跳转 不成功 国内搜索引 ...
- index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined
使用 webpack 编译 Vue 项目时出现报错: index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined ...
- Uncaught TypeError: Cannot read property ‘split’ of undefined
问题 :Uncaught TypeError: Cannot read property ‘split’ of undefinedat HTMLLIElement. split()切割的问题 因为遍历 ...
- DataTable插件报错:Uncaught TypeError: Cannot read property 'style' of undefined
DataTable插件报错:Uncaught TypeError: Cannot read property 'style' of undefined 原因:table 中定义的列和aoColumns ...
随机推荐
- [SVN]TortoiseSVN工具培训1─为什么要用SVN?
你是否有经历过以下情况: SVN的使用理由/好处:
- vos对接时业务确认及信息安全责任承诺书
业务确认及信息安全责任承诺书 双方达成一致,******网络科技有限公司向 有限公司提供中国移动网内语音线路接入服务,保证资源长期使用,保证线路资源接通率标 准,合 ...
- xampp中mysql重置root密码
1. 停止mysql:用图形化工具或者在cmd命令下输入net stop mysql,在c盘根目录下输入 2. 打开cmd,切换目录到 /xampp/mysql/bin, 运行 mysqld ...
- Docker cgroup.procs no space left on device
环境:centos6 运行docker 时 错误提示: System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1 ...
- My First Blog in Cnblogs
终于打算从csdn搬到博客园了 虽然在csdn只写过三篇文章,不过打算写第四篇的时候发现原先的三篇都消失了.联系客服最终还是找回了,不过对于csdn神奇的管理方式还是不放心,也没在csdn上再写过文章 ...
- 为什么CRM Opportunity的删除会触发一个通向BW系统的RFC
今天工作时我发现,我在SE38里用函数CRM_ORDER_DELETE删除一个Opportunity,居然弹出下图这个SAP Logon的屏幕,要连接BR1.这是什么鬼?! 查了一下,BR1是BW系统 ...
- cesium 加载倾斜摄影模型(这里有一坑)
代码如下: // Construct the default list of terrain sources. var terrainModels = Cesium.createDefaultTerr ...
- D. Bicycle Race_几何
D. Bicycle Race time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 【转】Xcode真机调试初体验
1. 开发者证书(Certificates) 分为开发(iOS Development)和发布(iOS Distribution)两种,无论是真机调试,还是上传到App Store都需要该证书,是一个 ...
- python_2_变量的使用2
''' 多行注释(三个单引号,或者双引号) gf_of_oldboy="Chen rong hua"#变量的表示办法1,用下划线(老男孩的女朋友) GfOfOldboy=" ...