2012-01-03 8 views
9

Mam działalność, która ma tylko WebView, która zawiera kod HTML, CSS i JavaScript.JavaScript nie działa w działaniu WebView

Wydaje się, że istnieje problem z dostępu z JavaScript do wielkości ekranem widoku. LogCat mówi:

(Tag: Web Console): Uncaught TypeError: Cannot call method 'getWidth' of undefined 
at file:///android_asset/Prospekte/grund/html5-player/js/epaper-mobile.js:20 

Kiedy patrzę w JS-pliku, znajduje się: var f=this.body.getWidth();

Nie Ciekawostką jest to, że czasami kod działa. Epaper jest dobrze pokazany. Ale najczęściej jest ten błąd.

setContentView(R.layout.prospekt_layout); 
    final Activity activity = this; 

    mWebView = (WebView) findViewById(R.id.prospekt_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.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
     { 
      // Handle the error 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
      view.loadUrl(url); 
      return true; 
     } 
    }); 

    mWebView.loadUrl("file:///android_asset/Prospekte/modKachel/mobile.html");  

Układ jest:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    > 
<WebView 
    android:id="@+id/prospekt_webview" 
    android:layout_width="900px" 
    android:layout_height="900px" 
/> 
</LinearLayout> 

Zmieniłem rozmiar Webview bo myślał, że może to być solution..but to nie działa z dp albo jest.

Ktoś ma pomysł?

Odpowiedz

16

Set to ustawienie, jak również dla Twojego Webview:

WebSettings settings = webView.getSettings(); 
settings.setDomStorageEnabled(true); 

o szczegóły odnoszą się odpowiedzieć w poniższym linku: ERROR/Web Console: Uncaught TypeError: Cannot call method 'getItem' of null at http://m.youtube.com/:844

Aktualizacja: lub dodawanie to może pomóc:

webView.loadDataWithBaseURL("fake://fake.com", myString, "text/html", "UTF-8", null); 
+0

Dzięki, ale już próbowałam. Mój błąd, że usunąłem to w kodzie.Więc kiedy to przetestowałem, po raz pierwszy zadziałało, za drugim razem nie. Czy to możliwe, że istnieje problem z czasem? Może DOM nie może być zbudowany wystarczająco szybko? Próbowałem AsyncTask, ale to też nie pomogło. – 10ff

+0

Cóż, nie można powiedzieć niczego podobnego do problemu z czasem itp. –

+1

Proszę zobaczyć aktualizację. –

1

Mam ten sam problem na Androidzie 3.2. Rozwiązanie, które działa dla mnie (bardzo brzydki) jest położyć spać i wywołać kolejną loadUrl, spróbuj więcej czasu jeśli 300ms nie jest wystarczająca:

myWebView.loadUrl("file:///android_asset/gabarit.html"); 
try { 
    Thread.sleep(300); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
myWebView.loadUrl("file:///android_asset/gabarit.html"); 
1

miałem ten sam problem z moim projekcie Browser Mo Da. Dodałem te dwie linie:

wvOptions.setBuiltInZoomControls(true); 
    wvOptions.setUseWideViewPort(true); 

wvOptions jest po prostu webview.getSettings() przechowywane w var. Druga linia prawdopodobnie rozwiązała problem. Pierwsza linia daje użytkownikom kontrolę nad wielkością wynikowej strony internetowej. Możesz dodać opcję "Otwórz w widoku ogólnym", jeśli podoba Ci się wynik. To mi nie pomogło, więc skorzystałem z opcji powiększenia.

+0

'+ 1' OMG te dwie linie zrobiły mój dzień. Moje ** HTML ** i ** CSS ** poprawnie renderowały, ale ** JS ** ładowało się na zawsze. Dodaję te dwie linie: 'wvOptions.setBuiltInZoomControls (true);' oraz 'wvOptions.setUseWideViewPort (true);' i działa teraz. Dziękuję Ci – fWd82

4

Należy domyślnie włączyć obsługę Javascript w swoim WebView, ponieważ może to spowodować XSS i inne luki.

web = new WebView(this); 
web.getSettings().setJavaScriptEnabled(true); 

Również wolę moję WebViewClient poprzez

WebViewClient webViewMainWebClient = new WebViewClient() 
{ 
    // Override page so it's load on my view only 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    { 
     // Return true to override url loading (In this case do nothing). 
     return false; 
    } 
} 
web.setWebViewClient(this.webViewMainWebClient); 

by pozwolił mi ograniczyć wykorzystanie tylko moich stron.