Предупреждение 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с этой страницы?

user655192
источник
6
Это «JavaScript», а не «Java Script», «java-script» или «Java script» (все они присутствовали в вашем исходном вопросе). Я исправил это для вас.
TJ Crowder
3
@TJCrowder Рискну сказать, что он должен называться Javascript .
Крис Селбекк 08
7
@KrisSelbekk: Нет. :-) "JavaScript" является зарегистрированным товарным знаком Oracle (нужно любить слияния и поглощения) и используется (с разрешения) Mozilla для их реализации. В обоих случаях с большой буквы S. Это единственная нормативная форма этого имени. Другое название языка, конечно, ECMAScript (или ES), но на самом деле никто не использует его, кроме случаев, когда речь идет о ES5 .
TJ Crowder

Ответы:

89

Отметьте эту ссылку и последний комментарий, который вы должны использовать WebChromeClientдля своих целей.

сидел
источник
8
Спасибо! webView.setWebChromeClient (новый WebChromeClient () {@Override общедоступное логическое значение onJsAlert (представление WebView, строковый URL-адрес, строковое сообщение, результат JsResult) {return super.onJsAlert (view, url, message, result);}});
nurnachman
ваш комментарий помог мне .. как и ответ Нихила ниже.
Вамси Чалла
Работает как шарм. Но тогда .... имеет ли WebClient какое-либо преимущество перед WebChromeClient.
Джош
3
Это может быть глупый вопрос, но в любом случае: зачем переопределять метод, чтобы вызывать только супер-метод с теми же параметрами?
Дмитрий Андриевский
1
Не забудьте добавитьwebview.getSettings().setJavaScriptEnabled(true);
Джемшит Искендеров
120

Как указывали другие, настройка WebChromeClient необходима alert()для работы. Достаточно просто установить WebChromeClient () по умолчанию:

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

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

Стивен Куан
источник
да, но в большинстве случаев вы хотите настроить события WebChromeClient, так что ...
Раду Симионеску
10
Мне, наконец, удалось заставить его работать, добавив mWebView.getSettings().setJavaScriptEnabled(true);перед строкойmWebView.setWebChromeClient(new WebChromeClient());
John Smith Optional
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");
}
user1645162
источник
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);
        }

    });
Tarit Ray
источник
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;
            }
    }
AbhinayMe
источник