103 votes

JavaScript ne fonctionne pas dans Android Webview ?

Je suis en train de faire une version Android d'une application iOS relativement simple qui utilise un webview, quelques boutons et qui repose ensuite sur des appels JavaScript à un CMS.

Mais je suis bloqué à un stade très précoce du développement : Le webview ne fonctionne pas avec JavaScript. J'ai lu de nombreux articles sur la façon d'activer JS dans un webview Android, mais jusqu'à présent, sans succès.

Voici une partie de mon code :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient());
    mWebView.setWebViewClient(new HelloWebViewClient()
    {
        @Override  
        public void onPageFinished(WebView view, String url)  
        {  
            //Appel d'une méthode init qui indique au site web que nous sommes prêts
            mWebView.loadUrl("javascript:m2Init()");
            page1(mWebView);
        }  
    });
  mWebView.loadUrl("http://my_url/mobile/iphone//app.php");  
}

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public void page11(View view)
{
    mWebView.loadUrl("javascript:m2LoadPage(1)");
}

Qu'est-ce que je fais de mal ici ? L'URL fonctionne parfaitement dans mon application iOS et dans un navigateur. Mais pas dans mon application !

S'il vous plaît, dites-moi que c'est quelque chose d'évident...

160voto

David K Points 482

FIXÉ! Poussé par l'erreur, j'ai découvert que j'avais besoin de définir

setDomStorageEnabled(true)

pour les paramètres du webview.

Merci pour votre aide Stephan :)

64voto

computingfreak Points 3980

Si quelque chose ne fonctionne pas avec WebView sur Android, j'essaie toujours de m'assurer de définir ces drapeaux fous tels que,

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDisplayZoomControls(false);
    webSettings.setSupportZoom(true);
    webSettings.setDefaultTextEncodingName("utf-8");

Je me demande pourquoi ces paramètres ne sont pas définis par défaut. Qui s'attendrait à des pages Web sans contenu JavaScript de nos jours, et à quoi sert-il d'avoir JavaScript activé lorsque DOM n'est pas disponible sauf s'il est spécifié. J'espère que quelqu'un a déjà signalé cela comme un bug ou une amélioration/demande de fonctionnalité et que les singes y travaillent.

et puis il y a des choses obsolètes qui pourrissent quelque part, comme ceci:

webView.getSettings().setPluginState(PluginState.ON);

Tout ça pour charger des pages Web dans l'application.

Sur iOS, tout est tellement simple - Swift 3.0

private func openURLWithInAppBrowser(urlString:String) {
    guard let url = URL(string:urlString) else {
        return
    }
    let sfSafari = SFSafariViewController(url:url)
    present(sfSafari, animated: true, completion: nil)
}

14voto

Mrudul Tora Points 380

Principalement, ces trois lignes seront suffisantes pour faire fonctionner le JavaScript dans webView...

webSetting.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());

Si cela ne fonctionne pas après cela, ajoutez également la ligne ci-dessous.

webSettings.setDomStorageEnabled(true);

En fait, vous avez besoin à la fois de setJavaScriptEnabled() et de setWebChromeClient(new WebChromeClient()) pour que le JavaScript fonctionne. Si vous utilisez seulement webSetting.setJavaScriptEnabled(true); alors ça ne marchera pas.

9voto

Shivam Kumar Points 1540

Chargement de javascript dans webview

webView.getSettings().setDomStorageEnabled(true);

7voto

prashant kute Points 37

Ajoutez les lignes de code suivantes dans votre MainActivity.java

Cela m'a aidé à activer JS

  webSetting.setJavaScriptEnabled(true);
  webView.setWebChromeClient(new WebChromeClient());
  webView.setWebViewClient(new WebViewClient());

N'oubliez pas cette autorisation dans le fichier AndroidManifest.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X