Запуск Javascript в WebView при использовании LoadData - PullRequest
2 голосов
/ 21 октября 2011

Я очень плохо знаком с Android Dev и разрабатываю то, что, как я думал, будет простым приложением. У меня есть некоторый HTML-код, который хранится в папке сырых ресурсов - код включает в себя некоторый Javascript. Когда я запускаю код в Google Chrome, он работает нормально, однако, когда я загружаю его в веб-просмотр с помощью функции loadData, он не запускает Javascript.

Я включил JavaScript с:

mWebView.getSettings().setJavaScriptEnabled(true);

Мне нужно иметь возможность запустить этот Javascript в браузере - любая помощь?

Ответы [ 5 ]

8 голосов
/ 27 января 2012

Попробуйте это:

webView.loadDataWithBaseURL ("blarg: // ignored", getData (), "text / html", "utf-8", "");

2 голосов
/ 23 октября 2011

Попробуйте вызвать функцию JS из кода. Как это:

mWebView.loadUrl("javascript:myFunction()");
1 голос
/ 04 апреля 2013

Я отслеживаю ответ @ Cobaia выше, с другой (я думаю) полезной функцией:

Поскольку мне нужно постоянно менять встроенный HTML во время тестирования и отладки, я решил взять необработанную страницу с моего локального веб-сервера во время разработки страницы и передать ее в webView следующим образом:

String url, str;

str = getFromURL(url);
webView.loadDataWithBaseURL("blarg://ignored", str, "text/html", "UTF-8", "");

где getFromURL () определяется как:

    public String getFromURL(String urlToRead) {
      URL url;
      HttpURLConnection conn;
      BufferedReader rd;
      String result = "";
      char[] chunk = new char[8192];
      int blen = chunk.length;
      int amt;      

      try {
         url = new URL(urlToRead);
         conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");


         rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
         while ((amt = rd.read(chunk, 0, blen)) > 0) {
             result += new String(chunk, 0, amt);
          }
         rd.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return result;
   }

Обратите внимание, что мне пришлось создать специальный контроллер (я использую CodeIgniter), чтобы разрешить загрузку файла в виде текстового файла с сервера.

Надеюсь, этот намек тоже поможет другим!

1 голос
/ 06 февраля 2013

Как выглядят загруженные данные HTML?В моем случае необработанные HTML-данные, которые я генерировал, были в формате:

<html>
<head>
<style>..</style>
<script>..</script>
</head>
<body>...</body>
</html>

При тестировании в обычном браузере все работало как положено.Однако, как только я использовал WebView.loadData, CSS, казалось, был распознан, но я обнаружил, что Javascript не работает.

То, что мне помогло, это перемещение Javascript во внешние файлы (точнее, я добавилскрипты, которые мне нужны для ресурсов / с использованием контент-провайдеров.

<html>
<head>
<link rel="stylesheet" type="text/css" href="content://PATHTOSTYLESHEET" />
<script src="content://PATHTOJS"></script>
</head>
<body>...</body>
</html>

Согласно В чем разница между loadData веб-просмотра Android и loadDataWithBaseURL , это звучит еще проще, если вы установите правильный базовый URLкакой ваш стиль / сценарии хранятся - используя соответствующий файл: // для всего, что вы храните локально.

0 голосов
/ 29 марта 2015

Вышеуказанные решения не работали для меня, потому что я загружал строку, которая содержала HTML вместо отдельного файла HTML.HTML-код в строке ссылается на скрипты JavaScripts, которые были в assets / www /.Что работало, так это использование mWv.loadDataWithBaseURL («file: /// android_asset / www /», HTML_AS_STRING, «text / html», «UTF-8», null);

Полный пример приведен ниже.,В этом примере создается веб-представление, загружается HTML-код из строки, а затем вызывается функция в отдельном файле JavaScript.Функция просто показывает предупреждение.

public class MainActivity extends Activity{

    private WebView mWv;

    private static final String HTML_AS_STRING = 
            "<!DOCTYPE html>"                                   +
            "<html>"                                            +
            "<head>"                                            +
            "</head>"                                           +
            "<body>"                                            +

            "<p>Just some text in a paragraph.</p>"             +
            "<div align=\"center\" style=\"color:#0000FF\">"    +
            "<h3>This is a heading in a div element</h3>"       +
            "<p>This is some text in a div element.</p>"        +
            "</div>"                                            +

            "<font size=\"4\" color=\"0000FF\">"                +
            "This is some sized and colored text."              +
            "</font>"           
                                                                +
            "<script src=\"index.js\"></script>"                +

            "</body>"                                           +
            "</html>";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        mWv = (WebView)findViewById(R.id.webview);      
        mWv.getSettings().setJavaScriptEnabled(true);

        mWv.setWebViewClient(new WebViewClient(){
            @Override  
            public void onPageFinished(WebView view, String url){  
                mWv.loadUrl("javascript:showAlert()");
            }  
        });
        mWv.setWebChromeClient(new WebChromeClient());

        mWv.loadDataWithBaseURL("file:///android_asset/www/", HTML_AS_STRING, "text/html", "UTF-8", null);      
    }
}

index.js (отдельный файл в assets / www /):

function showAlert() {
    alert("A simple alert!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...