L'alerte JavaScript ne fonctionne pas dans Android WebView

91

Dans mon application que j'utilise WebViewet en ce sens que j'utilise la JavaScript alert( )méthode mais qu'elle ne fonctionne pas, aucune fenêtre contextuelle n'apparaît.

dans mon fichier manifeste, j'ai ajouté

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

et dans le fichier d'activité j'ai ajouté

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/demo.html");

Dans le fichier xml de mise en page, j'ai ajouté

<WebView 
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

Un indice sur la façon d'activer le full JavaScriptin WebView?


Mettre à jour

Merci de marquer
la alert()méthode dans le htmlfichier fonctionne maintenant :).

Maintenant, il y a deux problèmes dans WebView:
1: J'utilise un <textarea>dans le fichier html que je charge WebViewet j'essaie d'écrire dans une police de langue hindi, mais lorsque j'essaie d'écrire du texte en hindi, il s'affiche sous forme de symboles (symboles rectangulaires comme []).

quand je fais la même chose dans le navigateur Firefox sur le bureau, cela fonctionne bien. un indice sur la façon de prendre en charge plusieurs langues textareaen WebView?

2: Lorsque je clique sur Soumettre et que j'essaye d'ouvrir la valeur du texte dans la alert()méthode dans un autre script java, cela ne fonctionne pas, cela signifie-t-il que même après avoir utilisé WebChromeClient son application uniquement pour la page html chargée actuelle et non javascriptsappelée à partir de cette page?

user655192
la source
6
C'est "JavaScript", pas "Java Script", "java-script" ou "Java script" (qui apparaissaient tous dans votre question d'origine). Je l'ai corrigé pour vous.
TJ Crowder
3
@TJCrowder J'oserais dire qu'il devrait s'appeler Javascript .
Kris Selbekk
7
@KrisSelbekk: Non. :-) "JavaScript" est une marque déposée d'Oracle (je dois adorer les fusions et acquisitions), et utilisée (avec permission) par Mozilla pour leur implémentation. Dans les deux cas, avec la majuscule S. C'est la seule forme normative de ce nom. L'autre nom du langage, bien sûr, est ECMAScript (ou ES), mais personne ne l'utilise vraiment sauf pour parler d' ES5 .
TJ Crowder

Réponses:

89

Vérifiez ce lien, et dernier commentaire, vous devez utiliser WebChromeClientpour votre but.

Sam
la source
8
Merci! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (vue WebView, String url, String message, JsResult result) {return super.onJsAlert (view, url, message, result);}});
nurnachman
votre commentaire m'a aidé .. tout comme la réponse de Nikhil ci-dessous.
Vamsi Challa
Fonctionne comme du charme. Mais alors .... WebClient a-t-il un avantage sur WebChromeClient.
Josh
3
C'est peut-être une question stupide, mais de toute façon: pourquoi remplacer une méthode pour n'appeler que la méthode d'un super avec les mêmes paramètres?
Dmitry Andrievsky
1
N'oubliez pas d'ajouterwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov
119

Comme d'autres l'ont indiqué, la configuration de WebChromeClient est nécessaire pour se mettre alert()au travail. Il suffit de définir le WebChromeClient () par défaut:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());

Merci pour tous les commentaires ci-dessous. Y compris John Smith qui a indiqué que vous deviez activer JavaScript.

Stephen Quan
la source
oui mais la plupart du temps, vous souhaitez modifier les événements du WebChromeClient alors ...
Radu Simionescu
10
J'ai finalement réussi à le faire fonctionner en ajoutant mWebView.getSettings().setJavaScriptEnabled(true);avant la lignemWebView.setWebChromeClient(new WebChromeClient());
John Smith Facultatif
2
N'oubliez pas d'ajouterwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov
22
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});
Nikhil Dinesh
la source
Cela fonctionne très bien, mais lorsque j'appelle à promptpartir de javascript, au lieu d'afficher le texte de l'invite, il est dit: "La page https: // ... dit:" brisant totalement l'immersion de la WebView intégrée dans l'application
Michael
5

Le code suivant fonctionnera:

private WebView mWebView;
final Activity activity = this;

// private Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            activity.setProgress(progress * 1000);
        }
    });

    mWebView.loadUrl("file:///android_asset/raw/NewFile1.html");
}
user1645162
la source
0

Tu peux essayer avec ça, ça a marché pour moi

WebView wb_previewSurvey=new WebView(this); 


       wb_previewSurvey.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            //Required functionality here
            return super.onJsAlert(view, url, message, result);
        }

    });
Tarit Ray
la source
0

si vous souhaitez masquer l'URL de l'utilisateur, affichez un AlertDialog comme ci-dessous.

myWebView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.d(TAG, "onJsAlert url: " + url + "; message: " + message);
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        mContext);
                builder.setMessage(message)
                        .setNeutralButton("OK", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int arg1) {
                                dialog.dismiss();
                            }
                        }).show();
                result.cancel();
                return true;
            }
    }
AbhinayMe
la source