Android Оценка веб-просмотра JavaScript выполняет неопределенную функцию - PullRequest
0 голосов
/ 11 февраля 2020

Я разрабатываю приложение Android, которое содержит WebView. Я пытаюсь переопределить метод действия onKeyDown.

Я хочу вызывать метод javascript каждый раз при нажатии backButton телефона, и если метод не определен, я хочу выполнить другую встроенную инструкцию (я хочу закрыть действие) .

В этом смысл: изначально я делаю это

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (true) {
                    webView.evaluateJavascript(  "try{pageGoBack();}" +
                                                        "catch{window.JSInterface.noBackFunction();}",null);
                    webView.clearCache(true);
                }
                return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

И для на каждой jsp стороне сервера я хочу реализовать что-то вроде этого:

<script>
        function pageGoBack() {
                       ---do something to go back---
                }
        }
</script>
...

Этот метод должен иметь одно и то же имя "pageGoBack" для каждого jsp, но может иметь различный внутренний код

Это факт: перед тем, как загрузить один из этих jsp с помощью pageGoBack метод все работает (ошибка 'undefined' перехватывается и выполняется метод JSInterface).

Когда я загружаю одну из этих страниц, метод «остается в кэше (???)» и всегда выполняется (также на тех страницах без него).

(Посмотрите, что я тоже добавлено webView.clearCache(true); но проблема остается)

Спасибо -

1 Ответ

0 голосов
/ 12 февраля 2020

[решено]

Это не было проблемой WebView или кэша Android. Это проблема javascript. Когда функция определена как «глобальная», она принимает глобальную область видимости при первой оценке. Поэтому, когда я впервые посетил. jsp, который содержит функцию pageGoBack (), функция стала видимой глобально.

Решение для моего случая:

У меня много jsp с графикой c компонент, как этот ◄, что означает «go вернуться на предыдущую страницу». Мне нужно было связать функцию нажатия кнопки jquery на текущей странице с кнопкой возврата Android. Поэтому я:

  • создал пустой css класс .empty-class-for-back-button
  • дал этот класс всем этим компонентам * компонент
  • Сделано глобальная js функция, подобная этой
function pageGoBack() { 
 var backBtn = $('.empty-class-for-back-button');
 if (backBtn.length > 0){
  backBtn.tap();
 }
 else{
  throw "css class not found";
 }
}
  • Android код тот же, что я написал в вопросе

Исключение теперь выброшено правильно, если на текущей странице нет элемента..

Надеюсь, это кому-нибудь пригодится.

...