可以在android中调用javascript函数吗?

Posted

技术标签:

【中文标题】可以在android中调用javascript函数吗?【英文标题】:It is possible to call a javascript function in android? 【发布时间】:2020-04-30 00:14:10 【问题描述】:

我知道我可以在 android 中执行函数并通过 javascript 调用它们,但我不知道是否可以在 android (java) 中调用 javascript 函数。

例如,我在 android 中有一个小应用程序,它打开一个 webview 并在我想要的网站内,当用户点击设备的后退按钮webview 调用一个 javascript 函数返回到(网站的)上一个操作,如果没有操作,它关闭应用程序而不是going to main activity

我知道我可以使用类似的东西:

@Override
public void onBackPressed() 
   if (mWebView.canGoBack()) 
       mWebView.goBack();
    else 
       finish();
   

但在我的情况下它不起作用,我需要致电js function

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

相信你可以使用

WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new MyCustomChromeClient(this));
webView.getSettings().setJavaScriptEnabled(true);
webView.evaluateJavascript("globalJavascriptFunction();", null);

https://developer.android.com/reference/android/webkit/WebView#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E)

第二个参数是回调。


[编辑]

要从 javascript 中获取值,您可以执行以下操作:

webView.evaluateJavascript("globalJavascriptFunction();", new ValueCallback<String>() 
    @Override
    public void onReceiveValue(String result)  
       // result is the return value of globalJavascriptFunction()
       // you'll have to do some testing inside here to figure out exactly how result gets sent back for your usecase
    
);

【讨论】:

Javascript 函数需要特定的地方吗? @CatarinaBatista 通常window.globalJavascriptFunction = function() ... 但是这段代码可以在 MainActivity.java 文件中吗? @CatarinaBatista webView.evaluateJavascript("globalJavascriptFunction();", null); 假设在您正在呈现的 web 视图的 html + javascript 中的某处,定义了函数 globalJavascriptFunction。您可以从webView.evaluateJavascript 调用任何全局可访问的函数 如果一个函数有返回值,我怎样才能得到这个值? (在创建要返回的函数之前,我正在尝试对其他现有函数进行测试)【参考方案2】:

可能缺少一些东西... 浏览下面的代码...

WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new MyCustomChromeClient(this));
webView.setWebViewClient(new MyCustomWebViewClient(this));
webView.clearCache(true);
webView.clearHistory();
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

...

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    if (event.getAction() == KeyEvent.ACTION_DOWN) 
        switch (keyCode) 
            case KeyEvent.KEYCODE_BACK:
                if (mWebView.canGoBack()) 
                    mWebView.goBack();
                 else 
                    finish();
                
                return true;
        

    
    return super.onKeyDown(keyCode, event);

【讨论】:

为什么是 onKeyDown?它不应该是 onBackPressed? 用onBackPressed()方法会考虑android循环,用onKeyDown()会考虑webView循环。 它不起作用,因为我正在访问的网站没有历史记录或导航 它适用于我...结帐:drive.google.com/file/d/1HqKJCU_u-Elg_enGqpzAMMI2FBaHAmed/… 如果您仍然发现这不起作用,请分享一些 gradle 代码和清单以获取更多信息... 但我已经尝试使用 google 并且它可以工作,但我正在尝试对我的同事创建的另一个网站做同样的事情,我认为我需要调用 js 函数来做到这一点跨度>

以上是关于可以在android中调用javascript函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Android 在 WebView 中调用 JavaScript 函数

java如何调用javascript的函数

Android Webview 和Javascript交互,实现Android和JavaScript相互调用

Android调用js的问题

未捕获的 ReferenceError,通过 android 应用程序调用 javascript 函数..?

如何从Android调用javascript?