web-dev-qa-db-ja.com

WebViewClientで一般的なJavaScriptを有効にする

グーグルで答えを探している間、解決することが不可能と思われる問題を抱えているのは私だけではないようです。

カスタムWebViewClientを使用してWebViewを作成することができました。これにより、プロセスダイアログを使用して、URLをロードできなかった場合にエラーメッセージを表示することができます。

しかし、これによりJavaScriptに問題が生じます。読み込んでいるURLには、HTML要素のCSSスタイル(要素の表示または非表示)を変更したり、onclickで別の場所にリダイレクトしたり、警告ボックスを表示したりするJavaScriptがあります。しかし、WebViewClientを使用することにより、これらのどれも機能しません。

これは私がページをロードする方法です:

public void loadUrl(String url)
{
    final ProgressDialog dialog = ProgressDialog.show(myActivity.this, "",  getString(R.string.loading), true);
            final WebView myWebView = (WebView) findViewById(R.id.webview);
            myWebView.setVerticalScrollBarEnabled(false);
            myWebView.setHorizontalScrollBarEnabled(false);
            WebSettings webSettings = myWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);                                         


            myWebView.setWebViewClient(new WebViewClient() 
            {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) 
                {
                    Toast.makeText(myActivity.this, url, Toast.LENGTH_SHORT).show(); //Debugging purposes
                if (url.endsWith(".mp4")) 
                {
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setDataAndType(Uri.parse(url), "video/mp4");
                        view.getContext().startActivity(intent);  
                }
                else
                {                           
                        view.loadUrl(url);
                    }

                    return true;
                }

                public void onPageFinished(WebView view, String url) 
                {
                    //Toast.makeText(myActivity.this, "Oh no!", Toast.LENGTH_SHORT).show();
                    dialog.dismiss();
                }

                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
                {
                    Toast.makeText(myActivity.this, description, Toast.LENGTH_SHORT).show();
                    String summary = "<html><body><strong>" + getString(R.string.lost_connection) + "</body></html>";
                    myWebView.loadData(summary, "text/html", "utf-8");   
                }              

             }); //End WebViewClient

            myWebView.loadUrl(url);     
        }

これはおそらくよりスマートな方法で行うことができますが、私はJavaとAndroid開発...

WebViewClientのJavaScriptを有効にすることはできますか? WebViewClientを削除することで問題は解決しますが、ページにエラーが発生したり、読み込みが完了したりすると、イベントをキャッチできません。

61
Repox

あなたの正確な問題が何なのかわかりませんが、JavaScriptとカスタムWebViewclientを問題なく有効にできます。

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

JavaScriptを有効にする適切な方法は、以下の2行を追加することです。

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

追加しても機能しない場合は、次の行を追加してみてください。

mWebView.getSettings().setDomStorageEnabled(true);

これで動作するはずです。 :)

5
Tatson Baptista

JavaScriptを有効にするにはこれを試してください

WebView myWebView = (WebView) findViewById(R.id.webView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient());
myWebView.loadUrl(url);
4
Rishabh Gupta

「Javascript-URLs」はshouldOverrideUrlLoadingを介してルーティングされますか?それを確認してみてください。そうであれば、そのようなリンクに対してfalseを返します(WebViewがWebViewClientではなくリンクを処理するように)

1
Timo Ohr

私のケースで何が起こったのか:ローカルhtmlファイルを提供していて、

    web.getSettings().setJavaScriptEnabled(true);
    web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

しかし、その後、私のURLは動作しなくなりました。 JSとローカルhrefの両方を機能させるソリューションは、追加することでした

    web.getSettings().setAllowFileAccess(true);
    web.getSettings().setAllowFileAccessFromFileURLs(true);

どこで

    web = (WebView) findViewById(R.id.embedded_web);
1
Nejc Medved

@mdelolmo answerと似ていますが、Kotlinで:

    webview.setWebChromeClient(WebChromeClient())
    webview.setWebViewClient(WebViewClient())
    webview.clearCache(true)
    webview.clearHistory()
    webview.getSettings().setJavaScriptEnabled(true)
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true)
0
Jerry Chong