Отключить всплывающие окна и оповещения в веб-представлении Android
Я использую webview с включенным javascript, так как это требуется в моем приложении полный рабочий день. Моя проблема в том, что мне нужно избегать всплывающих окон при загрузке URL-адресов в моем веб-представлении. Есть ли способ сделать это?
Я сталкивался с методом onJsAlert(), но согласно документации Android
Tell the client to display a javascript alert dialog.
If the client returns true, WebView will assume that the client will handle the dialog.
If the client returns false, it will continue execution.
и это не то, что я хочу. Я хочу, чтобы избежать всплывающих окон и предупреждений (включая подсказку и подтверждение), любая помощь будет оценена
Спасибо!
2 ответа
Вы можете попробовать переопределить предупреждение, подтвердить и т. Д. Возможно, добавьте флаг, когда разрешать, а когда не разрешать показ предупреждения. JavaScript: переопределение оповещения ()
Я попробовал подход, описанный в принятом ответе, от Kalel Wade, и внедряя JavaScript в каждое событие прогресса, я смог блокировать всплывающие окна. Тем не менее, я нашел то, что кажется гораздо более элегантным подходом.
Если вы расширите WebChromeClient, вы можете переопределить его метод onJsAlert() и заблокировать встроенный обработчик для предупреждений. Пока вы это делаете, вам, вероятно, захочется заблокировать вызовы подтвердить () и подсказать ():
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
result.cancel();
return true;
}
};
webView.setWebChromeClient(webChromeClient);
Учитывая, что вы видите предупреждения JavaScript, я полагаю, что вы уже назначили WebChromeClient. (Если вы этого не сделаете, оповещения не поддерживаются.) Поэтому нужно просто добавить вышеупомянутые переопределения.
Обязательно вызовите result.cancel() до возвращения. По моему опыту, если вы этого не сделаете, движок JavaScript, кажется, зависает; кнопка остается в нажатом состоянии, и последующее взаимодействие не регистрируется.