web-dev-qa-db-fra.com

Activation de JavaScript général dans WebViewClient

Lors de la recherche d'une réponse dans Google, il semble que je ne suis pas le seul à être confronté à un problème qui semble impossible à résoudre.

J'ai réussi à créer une WebView avec un WebViewClient personnalisé - cela me permet d'avoir un dialogue de processus et d'afficher un message d'erreur si une URL n'a pas pu être chargée.

Mais cela crée un problème avec JavaScript. L'URL que je charge contient du JavaScript qui modifie certains styles CSS des éléments HTML (affichage ou masquage de l'élément) ou redirige vers un autre emplacement en cliquant - ou peut-être même souhaite afficher une boîte d'alerte. Mais en utilisant WebViewClient, rien de tout cela ne fonctionne.

Voici comment je charge une page:

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);     
        }

Cela pourrait probablement être fait de manière plus intelligente, mais je suis nouveau à la fois Java et Android ...

Est-il possible pour moi d'activer le JavaScript pour WebViewClient? La suppression du WebViewClient résout le problème, mais je ne parviens pas à intercepter les événements lorsque la page se trompe ou se termine.

61
Repox

Je ne sais pas quel est votre problème exact, mais je peux activer le JavaScript et un WebViewclient personnalisé sans aucun problème:

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

La bonne façon d'activer JavaScript consiste à ajouter les deux lignes ci-dessous:

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

Même si après avoir ajouté son ne fonctionne pas, essayez d'ajouter la ligne ci-dessous.

mWebView.getSettings().setDomStorageEnabled(true);

Maintenant ça devrait marcher. :)

5
Tatson Baptista

Essayez ceci pour activer javascript

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

Les "URL Javascript" sont-elles acheminées via shouldOverrideUrlLoading? Essayez de vérifier cela et si c'est le cas, renvoyez false pour des liens comme celui-ci (afin que la vue Web gère le lien, pas votre WebViewClient)

1
Timo Ohr

Qu'est-il arrivé dans mon cas: je servais des fichiers html locaux et lors de l'application

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

mais mes URL ont cessé de fonctionner. La solution pour faire fonctionner JS et href local était d'ajouter

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

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

Similaire à la réponse @mdelolmo, mais dans Kotlin:

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