100

In my application I am using WebView and in that I am using JavaScript alert( ) method but its not working, no pop-up appears.

in my manifest file I have added

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

and in activity file I have added

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

In layout xml file I have added

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

Any clue how to enable full JavaScript in WebView?


Update

Thanks mark
the alert() method in the html file are working now :) .

Now there are two issues in WebView :
1: I am using a <textarea> in the html file that i am loading in WebView , and trying to write in Hindi language font in it, but when i try to write Hindi text it displays as symbols ( rectangle symbols like [] ) .

when i do the same in firefox browser on desktop it works fine. any clue how to give support for multiple language in textarea in WebView ?

2: When I am clicking submit and trying to open the value of text in alert() method in another java script it doesn't work , does it mean even after using WebChromeClient its applicable only for current loaded html page and not javascripts called from that page ?

3
  • 6
    It's "JavaScript", not "Java Script", "java-script", or "Java script" (all of which appeared in your original question). I've corrected it for you. Commented Mar 11, 2011 at 10:49
  • 3
    @T.J.Crowder I would venture to say it should be called Javascript. Commented Aug 8, 2012 at 8:20
  • 7
    @KrisSelbekk: Nope. :-) "JavaScript" is a registered trademark of Oracle (gotta love mergers and acquisitions), and used (with permission) by Mozilla for their implementation. In both cases, with the capital S. That's the only normative form of that name. The other name for the language, of course, is ECMAScript (or ES), but no one really uses it except when talking about ES5. Commented Aug 8, 2012 at 9:11

6 Answers 6

136

As others indicated, setting the WebChromeClient is needed to get alert() to work. It's sufficient to just set the default WebChromeClient():

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

Thanks for all the comments below. Including John Smith's who indicated that you needed to enable JavaScript.

3
  • yes but most of the times you want to tweak with the events of the WebChromeClient so... Commented Oct 30, 2013 at 14:59
  • 10
    I finally managed to have it work by adding mWebView.getSettings().setJavaScriptEnabled(true);before the line mWebView.setWebChromeClient(new WebChromeClient()); Commented Jul 7, 2014 at 14:26
  • 2
    Don't forget to add webview.getSettings().setJavaScriptEnabled(true);
    – Jemshit
    Commented May 25, 2016 at 13:09
98

Check this link , and last comment , You have to use WebChromeClient for your purpose.

8
  • 8
    thank you! webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } });
    – nurnachman
    Commented Oct 15, 2012 at 12:04
  • your comment helped me.. as does the Nikhil's answer below. Commented May 9, 2014 at 15:34
  • Works like charm. But then.... does WebClient have any advantage over WebChromeClient.
    – Josh
    Commented Sep 1, 2015 at 10:38
  • 3
    It may be a stupid question, but anyway: why override a method to only call a super's method with the same params? Commented Oct 29, 2015 at 6:25
  • 1
    Don't forget to add webview.getSettings().setJavaScriptEnabled(true);
    – Jemshit
    Commented May 25, 2016 at 13:09
27
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});
1
  • This works great, but when I call prompt from javascript, instead of displaying the prompt text it says, "The page at https://... says:" totally breaking the immersion of the WebView being embedded in the app
    – Michael
    Commented Nov 9, 2016 at 18:13
6

The following code will work:

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

You can try with this, it worked for me

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

    });
0

if you wish to hide URL from the user, Show an AlertDialog as below.

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.