pengwei1024 / JsBridge

A simpler, extendable bidirectional communication Frame between Android WebView and Javascript
https://github.com/pengwei1024/JsBridge/wiki
Apache License 2.0
643 stars 88 forks source link

app如何调用js定义的函数,并获取函数传递的对象参数? #17

Closed amydomi closed 5 years ago

amydomi commented 6 years ago

例如: window.funTest = function(jsonData) { console.log(jsonData) }

App里面如何执行window.funTest() 并拿到jsonData数据?

pengwei1024 commented 6 years ago

App执行window.funTest的话可以直接用

WebView.loadUrl("javascript:window.funTest('data')")

但是并不能获取到传递的jsonData,除非如你上面的例子,在Android里面拦截console.log数据,这是不推荐的(因为console使用频率很高)。或者在console.log地方调用JsBridge的方法传递给App

amydomi commented 6 years ago

可能我没表达清楚我的用途。 我在js里面定义函数给app去使用,app传递一个json对象给js WebView.loadUrl("javascript:window.funTest('data')") 这个只能传递字符串参数,并不能传递json对象

pengwei1024 commented 6 years ago

所以JsBridge就是解决这个问题的呀。

举个ajax的例子,app对前端暴露ajax方法

@JSBridgeMethod
public void ajax(JBMap dataMap) {
        String type = dataMap.getString("type");
        String url = dataMap.getString("url");
        JBMap data = dataMap.getJBMap("data");
        JBCallback successCallback = dataMap.getCallback("success");
        JBCallback errorCallback = dataMap.getCallback("error");
        // Omit the request code
        if (request success) {
              successCallback.apply("success");
        } else {
              errorCallback.apply("failure");
        }
}

前端调用就可以传递对象啦

JsBridge.ajax({
    type:'GET',
    url:'xxx.com',
    dataType:'text'
    data:{a:1, b:'xx'},
    success:function(data){
    },
    error:function(err){
    }
})