Должна ли инъекция Javascript работать даже для веб-страниц без какого-либо Javascript? - PullRequest
2 голосов
/ 02 сентября 2011

Один из методов в моих приложениях - использовать трюк внедрения Javascript, описанный в этой теме , для захвата всего HTML веб-страницы после рендеринга:

// This call inject JavaScript into the page which just finished rendering.
browser.loadUrl(
  "javascript:window.HTMLOUT.processHTML(
    document.getElementsByTagName('html')[0].innerHTML);");

Это работает - даже для очень богатых веб-страниц - но когда он пытается обрабатывать аналогичным образом страницы, которые не содержат any Javascript в них, он генерирует следующую ошибку:

ERROR/Web Console(1335): Uncaught TypeError: 
  Cannot call method 'processHTML' of undefined at :1

В своем поиске возможной основной причины или объяснения я обнаружил довольно много сообщений, описывающих Uncaught TypeError: Cannot call method *** of undefined at :1 с двумя типичными ответами:

  1. Использование webView.getSettings ().setDomStorageEnabled (true);
  2. "Обычно, когда ошибка имеет форму Невозможно вызвать метод 'X' из неопределенного, это означает, что любой объект, который вы пытаетесь вызвать X из не существует. "

Ну, причина проблемы в моем случае не может быть # 1 (setDomStorageEnabled), потому что я уже правильно установил это в своем коде!

Так что единственное другое возможнообъяснение состоит в том, что объект, из которого я пытаюсь вызвать processHTML(), не выходит.Этот объект называется HTMLOUT и он создается в onCreate () действия после создания объекта WebView и инициализации его с помощью setWebViewClient():

webView.addJavascriptInterface(new JavascriptInterface(this, webView), "HTMLOUT");

. Это заставляет меня подозревать, что создание экземпляра объекта JavascriptInterfaceпо какой-то причине терпит неудачу.

Здесь мое понимание останавливается и начинаются мои вопросы:

  1. Имеет ли смысл то, что я описывал до сих пор?
  2. Если такпочему сбой создания экземпляра объекта JavascriptInterface?
  3. Возможно ли, что причиной сбоя является отсутствие какого-либо Javascript в исходном HTML?
  4. Что можно сделать, чтобы обойти эту проблемуэто проблема?
...