android - 关于一个简单的webview中直接执行javascript函数的问题
迷茫
迷茫 2017-04-10 17:18:10
[JavaScript讨论组]

坦白讲应该是不难的,但本人不会js 所以开发起来有点难以下手 , 百度了很多的demo看了之后自己写完还是有问题 不知道什么情况 特来请教大家
我自己是在android平台写的
登陆地址: http://101.226.249.86:8080/jservice/#/SignIn (将这个地址用webview显示出来)
一.交互方式:

  1. 客户端网页中发起一个自定义url的请求,浏览器可以拦截到对应的请求;这一过程
    相当于网页给Webview 发起了一个事件通知,其中自定义URL请求格式为:

ccn-webkit-bridge://xxx?functionName=xx
其中functionName参数是回调javascript函数的名字

  1. 接着webview中直接执行javascript函数,获取到对应的参数;

  2. 执行相关的native操作.
    二.

客户端登录结束, 待服务器返回登录结果之后,执行如下的javascript代码

/**
  • 该函数供 webkit 回调,返回 login 结果给 webkit

  • @return 注册 login 结果的 json 对象的字符串格式
    **/

  1. xxx() {

  2. null
    }

以上是人家给我的东西, 剩下都靠自己写
以下第一张图是登录页面,是一个webview, ,第二张是点击登录后的样子

附上自己的一部分代码 希望对答者有帮助,谢谢.

webView.loadUrl("http://101.226.249.86:8080/jservice/#/SignIn");
        //启用支持javascript  加上这句话才能使用javascript方法
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        //优先使用缓存
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webView.addJavascriptInterface(new MyJavaScriptInterface(), "getResult");
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
                view.loadUrl(url);
                return false;
            }
        });
        //window.location.href = "ccn-webkit-bridge://did-login?functionName=getResult";
        //webView.addJavascriptInterface(new Object(), "getResult");
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
PHP中文网
public boolean shouldOverrideUrlLoading(...) {
    view.loadUrl(url);// 
    return true;
}

这个方法你调用了view.loadUrl(url);,所以WebView就去加载那个连接
而那个链接是无法正常显示的,因此出现下图的异常

按照你的说法,应该是 识别到这个 URL 后,原生代码去执行相关的操作
最终将 原生代码的结果反馈给 WebView

所以,我感觉正确的流程是:

public boolean shouldOverrideUrlLoading(...) {
    if({是调用native方法的连接}) {
        // 执行native逻辑
        // 你当前的逻辑是, 调用js方法,拿参数,去登录,取结果,再给webview
        
        return true; // 不调用`loadUrl`,无刷新webview
    } else {
        view.loadUrl(url);// 比如打开了一个新的其他的链接
        return true;
    }
}

希望能解决的你的问题

PHPz

你好:

看了半天,还是没有很明白你的意思。
    1. 你是否是想自定义一种请求格式,去执行你暴露出来的 java 方法?

    2. 只是想直接在网页中调用暴露的 java 方法?

    1. 首先来回答第二种情况。

      webView.addJavascriptInterface(new MyJavaScriptInterface(), "getResult");

    你的代码,已经暴露了一个名为 getResult 的对象在 js 的 window对象中了。
    也就是说,你只需要登录界面(http://101.226.249.86:8080/jservice/#/SignIn) 的js 模块中运用此方法即可。
    例如:在你的 MyJavaScriptInterface() 中有一个名为 login 的方法。
    js 调用如下(在你的服务器 html中):

    <script type="text/javascript">
        function Login() {
            let username = 'test';
            let password = '****';
            window.getResult.login(username, password);
        }
    </script>
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习
    PHP中文网抖音号
    发现有趣的

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号