La alerta de JavaScript no funciona en Android WebView

91

En mi aplicación que estoy usando WebViewy en que estoy usando el JavaScript alert( )método pero no funciona, no aparece ninguna ventana emergente.

en mi archivo de manifiesto he agregado

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

y en el archivo de actividad he agregado

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

En el archivo de diseño xml que he agregado

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

Cualquier idea de cómo habilitar completa JavaScripten WebView?


Actualizar

Gracias, marque
el alert()método en el htmlarchivo que está funcionando ahora :).

Ahora hay dos problemas en WebView:
1: Estoy usando un <textarea>en el archivo html en el que estoy cargando WebViewe intento escribir en la fuente del idioma hindi, pero cuando trato de escribir texto en hindi, se muestra como símbolos (símbolos rectangulares como []).

cuando hago lo mismo en el navegador Firefox en el escritorio, funciona bien. ¿Alguna idea de cómo dar soporte para múltiples idiomas textareaen WebView?

2: Cuando hago clic en enviar e intento abrir el valor del texto en el alert()método en otro script java, no funciona, ¿significa que incluso después de usar WebChromeClient su aplicable solo para la página html cargada actual y no se javascriptsllama desde esa página?

usuario655192
fuente
6
Es "JavaScript", no "Java Script", "java-script" o "Java script" (todos los cuales aparecieron en su pregunta original). Te lo he corregido.
TJ Crowder
3
@TJCrowder Me atrevería a decir que debería llamarse Javascript .
Kris Selbekk
7
@KrisSelbekk: No. :-) "JavaScript" es una marca registrada de Oracle (me encantan las fusiones y adquisiciones), y Mozilla la utiliza (con permiso) para su implementación. En ambos casos, con la S mayúscula. Ésta es la única forma normativa de ese nombre. El otro nombre para el idioma, por supuesto, es ECMAScript (o ES), pero nadie lo usa realmente excepto cuando se habla de ES5 .
TJ Crowder

Respuestas:

89

Consulte este enlace y el último comentario que debe utilizar WebChromeClientpara su propósito.

se sentó
fuente
8
¡gracias! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (vista WebView, String url, String mensaje, resultado JsResult) {return super.onJsAlert (view, url, message, result);}});
nurnachman
su comentario me ayudó ... al igual que la respuesta de Nikhil a continuación.
Vamsi Challa
Funciona a las mil maravillas. Pero entonces ... ¿WebClient tiene alguna ventaja sobre WebChromeClient?
Josh
3
Puede ser una pregunta estúpida, pero de todos modos: ¿por qué anular un método para llamar solo al método de un super con los mismos parámetros?
Dmitry Andrievsky
1
No olvide agregarwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov
119

Como otros indicaron, es necesario configurar WebChromeClient para comenzar alert()a trabajar. Es suficiente establecer el WebChromeClient () predeterminado:

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

Gracias por todos los comentarios a continuación. Incluyendo a John Smith, quien indicó que necesitaba habilitar JavaScript.

Stephen Quan
fuente
sí, pero la mayoría de las veces desea modificar los eventos de WebChromeClient, así que ...
Radu Simionescu
10
Finalmente logré que funcionara agregando mWebView.getSettings().setJavaScriptEnabled(true);antes de la líneamWebView.setWebChromeClient(new WebChromeClient());
John Smith Opcional
2
No olvide agregarwebview.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
fuente
Esto funciona muy bien, pero cuando llamo promptdesde javascript, en lugar de mostrar el texto del mensaje, dice: "La página en https: // ... dice:", rompiendo totalmente la inmersión de WebView que se incrusta en la aplicación
Michael
5

El siguiente código funcionará:

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
fuente
0

Puedes probar con esto, funcionó para mí

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
fuente
0

si desea ocultar la URL al usuario, muestre un AlertDialog como se muestra a continuación.

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
fuente