2012-01-03 16 views
9

Possiedo un'attività che ha solo una WebView, che contiene codice HTML, CSS e Javascript.Javascript non funziona in un'attività WebView

Sembra che ci sia un problema con il accesso di Javascript alle dimensioni dello schermo della vista. LogCat dice:

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

Quando guardo nel js file, c'è: var f=this.body.getWidth();

cosa ci curiosa è che volte il codice funziona. Il epaper è mostrato bene. Ma la maggior parte del tempo c'è questo errore.

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");  

Il layout è:

<?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> 

ho cambiato la dimensione del WebView causa ho pensato che questo potrebbe essere il solution..but non c'è da lavorare con dp sia.

Qualcuno ha un'idea?

risposta

16

Imposta questa impostazione anche per il vostro WebView:

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

per i dettagli consultare la risposta al seguente link: ERROR/Web Console: Uncaught TypeError: Cannot call method 'getItem' of null at http://m.youtube.com/:844

Aggiornamento: o l'aggiunta di questo potrebbe aiutare:

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

Grazie, ma ho provato già. Il mio errore è che ho cancellato questo codice.Quindi, quando ho provato questo, la prima volta che ha funzionato, la seconda volta non ha funzionato. È possibile che ci sia un problema con il tempo? Forse il DOM non può essere costruito abbastanza velocemente? Ho provato un AsyncTask, ma non è stato d'aiuto. – 10ff

+0

Beh, non si può dire nulla di simile con il tempo o ecc. –

+1

si prega di consultare l'aggiornamento. –

1

Ha lo stesso problema su android 3.2. Una soluzione che funziona per me (abbastanza brutto) è quello di mettere un sonno e chiamare un altro loadURL, provare con più tempo se 300ms non è sufficiente:

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

Ho avuto lo stesso problema con il mio progetto Mo Da Browser. Ho aggiunto queste due righe:

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

wvOptions è solo webview.getSettings() memorizzati in un var. La seconda riga sembra aver risolto il problema. La prima riga consente agli utenti di controllare la dimensione della pagina Web risultante. Puoi aggiungere l'opzione "apri nella panoramica" se ti è piaciuto il risultato. Questo non mi ha aiutato quindi ho usato l'opzione di zoom.

+0

'+ 1' OMG queste due linee hanno reso la mia giornata. Il mio ** HTML ** e ** CSS ** sono stati visualizzati correttamente ma ** JS ** si stava caricando per sempre. Aggiungo queste due righe: 'wvOptions.setBuiltInZoomControls (true);' e 'wvOptions.setUseWideViewPort (true);' e funziona ora. Grazie – fWd82

4

È necessario abilitare implicitamente l'esecuzione di Javascript nel proprio WebView, poiché ciò potrebbe causare XSS e altre vulnerabilità.

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

Inoltre, preferisco impostare il mio WebViewClient via

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); 

di farmi limitare l'utilizzo di soli miei siti.