android无法从Javascript运行Java函数

android无法从Javascript运行Java函数,javascript,android,Javascript,Android,在我的项目中,我有一个WebView,它加载一个页面(HTML)。 我想更改所有图像,并在用户单击任何图像时显示祝酒词 因此,我添加了调用Java函数的javascript代码: //代码在onPageFinished(..)函数中 JavaScriptInterface jsInterface=新的JavaScriptInterface(活动); webView.getSettings().setJavaScriptEnabled(true); addJavascriptInterface(j

在我的项目中,我有一个
WebView
,它加载一个页面(HTML)。 我想更改所有图像,并在用户单击任何图像时显示祝酒词

因此,我添加了调用Java函数的javascript代码:

//代码在onPageFinished(..)函数中
JavaScriptInterface jsInterface=新的JavaScriptInterface(活动);
webView.getSettings().setJavaScriptEnabled(true);
addJavascriptInterface(jsInterface,jsInterface);
webView.evaluateJavascript(
“var imgs=document.getElementsByTagName('img')+
“对于(var i=0;i“window.JSInterface.showtoos();”+/看起来您没有


或者您可以先从资源加载html内容。使用
webView.loadUrl();

无需等待图像在dom级别出现

WebView webView= findViewById(R.id.webview);
    JavaScriptInterface jsInterface = new JavaScriptInterface(this);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(jsInterface, "JSInterface");

    webView.evaluateJavascript(

            "document.write('<img>');" +
                    "document.write('<img>');\n"+
                    "var x = document.getElementsByTagName('IMG');" +
                    "console.log(x.length);"+
                    "for (var i = 0; i < x.length; i++) {" +
                    "x[i].src = 'https://www.imagemagick.org/Usage/images/badge_overlay.png';" +
                    "x[i].addEventListener('click', function() {" +
                    "window.JSInterface.showToast(); " +    // <-- now calling :)
                    "});" +
                    "} " +
                    "window.JSInterface.showToast();"   // <-- is called
            , null);

在本例中,我使用了string literals=>

删除evaluateJavascript方法并使用loadUrl。请尝试以下代码,它对我有用:-

 string code = `
     document.addEventListener("click",(e)=> {
        if(e.target instanceof Image){
            window.JSInterface.showToast();
        }
     });`
 webView.evaluateJavascript(code, null);

您是否尝试过使用Javascript函数来调用Java,并将其放在与webview相关的html页面中。将其放在标题处,这样在以后发生单击事件时,它肯定会出现,并且在对函数进行任何计算后不会消失,就像您现在的情况一样

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast() {
        Toast.makeText(mContext, "Toast message", Toast.LENGTH_SHORT).show();
    }
}

函数showAndroidToast(toast){
JSInterface.showtoos(toast);
}
我发现类似案例的来源总是指单独的html:

[1]


[2]

我不知道为什么,但您可以通过在加载HTML内容之前添加JavaScript接口来解决此问题

<script type="text/javascript">
    function showAndroidToast(toast) {
        JSInterface.showToast(toast);
    }
</script>
jsInterface=新的JavaScriptInterface(活动);
fragmentWebView.getSettings().setJavaScriptEnabled(true);
fragmentWebView.getSettings().setDomStorageEnabled(true);
addJavascriptInterface(jsInterface,“jsInterface”);
fragmentWebView.loadDataWithBaseURL(“file:///android_asset/“,完整html,“文本/html”,“utf-8”,空);
fragmentWebView.setWebViewClient(新WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url){
super.onPageFinished(视图、url);
view.loadUrl(
“javascript:var-imgs=document.getElementsByTagName('img');”+
“对于(var i=0;i
这绝对是你应该做的(假设第一个调用可以工作,正如你所说)。与真实代码(如果这不是你的真实代码)相比,你是否简化了太多示例?具体来说,在您的真实代码中,您是否从事件处理程序中使用了
i
?因为这可能是。T.J.Crowder:实际上,我没有简化代码-我已经剪切并粘贴了它。在这种情况下,您需要查看页面加载和单击后发生的更改。错误消息告诉您
window.JSInterface
is(现在)
未定义
,而它之前有一个不同的值(对对象的引用)。由于某种原因,它发生了变化。我认为我们无法从上面的问题中看出什么发生了变化,但这正是您想要寻找的。
<script type="text/javascript">
    function showAndroidToast(toast) {
        JSInterface.showToast(toast);
    }
</script>
jsInterface = new JavaScriptInterface(activity);
fragmentWebView.getSettings().setJavaScriptEnabled(true);
fragmentWebView.getSettings().setDomStorageEnabled(true);
fragmentWebView.addJavascriptInterface(jsInterface, "JSInterface");

fragmentWebView.loadDataWithBaseURL("file:///android_asset/", fullHtml, "text/html", "utf-8", null);
fragmentWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        view.loadUrl(
            "javascript:var imgs = document.getElementsByTagName('img');" +
            "for (var i = 0; i < imgs.length; i++) {" +
            "imgs[i].src = 'file:///android_asset/rules_images_placeholder.png';" +
            "imgs[i].addEventListener('click', function(e) {" +
            "window.JSInterface.showToast(); " +
            "});" +
            "}" +
            "console.log(window.JSInterface);" +
            "window.JSInterface.showToast(); ");
    }
});