首页 > 解决方案 > Android webView - 没有调用javascript代码

问题描述

我尝试在我的 webview 中加载这个 javascript:

@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen);

    website = "https://www.blizz-z.de";
    myWebView = findViewById(R.id.blizzView);

    WebSettings settings = blizzView.getSettings();
    settings.setJavaScriptEnabled(true);

    myWebView.setWebViewClient(new WebViewClient() {

        @Override
        // Notify the host application that a page has finished loading.
        public void onPageFinished(WebView view, String url)
        {
            myWebView.loadUrl(
                    "javascript:(function() {" +
                        "setInterval(function() {" +
                            + "jQuery('#myInput').css('background', '#'+(Math.random()*0xFFFFFF<<0).toString(16));"
                        + "}, 1000);"
                    + "});"
            );
        }
    }

    ...

}

但它没有被执行。如果我在桌面浏览器中执行脚本,那么它就可以工作。它只是为了测试目的而更改了我网站上搜索栏的背景颜色。

setIntervalwebView 不支持?

更新:

我用js@mohkamfer 的回答中的函数进行了尝试:

@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen);

    website = "https://www.blizz-z.de";
    blizzView = findViewById(R.id.blizzView);

    WebSettings settings = blizzView.getSettings();
    settings.setJavaScriptEnabled(true);

    myWebView.setWebViewClient(new WebViewClient() {

        @Override
        // Notify the host application that a page has finished loading.
        public void onPageFinished(WebView view, String url)
        {
            js(myWebView, "(function() {" +
                        "setInterval(function() {" +
                            + "jQuery('#myInput').css('background', '#'+(Math.random()*0xFFFFFF<<0).toString(16));"
                        + "}, 1000);"
                    + "});"
            );
        }
    }

    ...

}

public void js(WebView view, String code)
{
    String javascriptCode = "javascript:" + code;
    if (Build.VERSION.SDK_INT >= 19) {
        view.evaluateJavascript(javascriptCode, new ValueCallback<String>() {

            @Override
            public void onReceiveValue(String response) {
                Log.i("debug_log", response);
            }
        });
    } else {
        view.loadUrl(javascriptCode);
    }
}

但这没有什么区别。

标签: javascriptandroidwebview

解决方案


您是否在 API 19 或更高版本上进行部署?如果是这样,您将不得不使用WebView#evalulateJavascript而不是WebView#loadUrl

我总是使用这种方法来简化和加快事情

public void js(String code) {
    if (Build.VERSION.SDK_INT >= 19) {
        this.evaluateJavascript(code, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String response) {
            }
        });
    } else {
        this.loadUrl("javascript:" + code);
    }
}

推荐阅读