Попередження JavaScript не працює в Android WebView


91

У моїй програмі я використовую WebViewі в тому, що я використовую JavaScript alert( )метод, але він не працює, спливаюче вікно не з'являється.

у своєму файлі маніфесту я додав

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

а у файлі активності я додав

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

У макет xml-файлу, який я додав

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

Будь-ключ , як включити повний JavaScriptін WebView?


Оновлення

Завдяки відзначити метод в файлі працює зараз :).
alert()html

Зараз є дві проблеми WebView:
1: я використовую <textarea>файл html, який я завантажую WebView, і намагаюся писати шрифтом мовою хінді, але коли я намагаюся написати текст хінді, він відображається як символи (символи прямокутника, такі як []).

коли я роблю те саме у браузері firefox на робочому столі, це працює нормально. будь-яка підказка, як надати підтримку для кількох мов textareaу WebView?

2: Коли я натискаю "Відправити" і намагаюся відкрити значення тексту в alert()методі в іншому сценарії Java, це не працює, чи означає це навіть після використання WebChromeClient його застосовного лише для поточно завантаженої HTML-сторінки, а не javascriptsвикликаного з цієї сторінки?


6
Це "JavaScript", а не "Java Script", "java-script" або "Java script" (усі вони з'явилися у вашому вихідному запитанні). Я виправив це для вас.
TJ Crowder,

3
@TJCrowder Я наважусь сказати, що це має називатися Javascript .
Kris Selbekk

7
@KrisSelbekk: Ні. :-) "JavaScript" - це зареєстрована торгова марка Oracle (треба любити злиття та поглинання) і використовується (з дозволу) Mozilla для їх реалізації. В обох випадках із великою літерою S. Це єдина нормативна форма цієї назви. Звичайно, інша назва мови - ECMAScript (або ES), але насправді ніхто не використовує її, крім випадків, коли мова йде про ES5 .
TJ Crowder

Відповіді:


89

Перевірте це посилання, і останній коментар, Ви повинні використовувати WebChromeClientдля своєї мети.


8
Дякую! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (View WebView, String url, String message, JsResult result) {return super.onJsAlert (view, url, message, result);}});
nurnachman

Ваш коментар мені допоміг .. як і відповідь Nikhil нижче.
Vamsi Challa

Працює як шарм. Але тоді .... чи має WebClient якусь перевагу перед WebChromeClient.
Джош

3
Це може бути дурним питанням, але в будь-якому випадку: навіщо перевизначати метод, щоб викликати метод супер тільки з тими ж параметрами?
Дмитро Андрієвський

1
Не забудьте додатиwebview.getSettings().setJavaScriptEnabled(true);
Джемшит Іскендеров

119

Як зазначали інші, налаштування WebChromeClient потрібно, щоб приступити alert()до роботи. Достатньо просто встановити WebChromeClient за замовчуванням ():

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

Дякую за всі коментарі нижче. У тому числі Джон Сміт, який вказав, що вам потрібно ввімкнути JavaScript.


так, але в більшості випадків ви хочете налаштувати події WebChromeClient так ...
Раду Сіміонеску

10
Нарешті мені вдалося змусити це додати, додавши mWebView.getSettings().setJavaScriptEnabled(true);перед рядкомmWebView.setWebChromeClient(new WebChromeClient());
Джон Сміт Необов’язково

2
Не забудьте додатиwebview.getSettings().setJavaScriptEnabled(true);
Джемшит Іскендеров

22
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});

Це чудово працює, але коли я дзвоню promptз javascript, замість відображення тексту підказки там пише: "Сторінка на https: // ... каже:" повністю порушує занурення WebView, що вбудовується в додаток
Майкл

5

Працюватиме наступний код:

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

Ви можете спробувати з цим, у мене це вийшло

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

якщо ви хочете приховати URL-адресу від користувача, покажіть AlertDialog, як показано нижче.

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;
            }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.