2012-01-03 17 views
9

Tengo una actividad que tiene solo WebView, que contiene código HTML, CSS y Javascript.Javascript no funciona en una actividad de WebView

Parece que hay un problema con el acceso de Javascript al tamaño de la pantalla de la 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 

Cuando miro en el JS-archivo, no es: var f=this.body.getWidth();

Lo curioso es que hay veces el código funciona. El epaper se muestra bien. Pero la mayoría del tiempo hay este error.

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

El diseño es:

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

he cambiado el tamaño de la web View porque pensé que esto podría ser el solution..but no es de trabajar con dp tampoco.

Alguien tiene en la idea?

Respuesta

16

Activarla bien para su web View:

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

para el detalle se refieren a responder en el siguiente enlace: ERROR/Web Console: Uncaught TypeError: Cannot call method 'getItem' of null at http://m.youtube.com/:844

Actualización: o añadiendo que esto podría ayudar:

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

Gracias, pero ya lo he intentado. Mi error es que eliminé esto en el código.Entonces cuando probé esto, la primera vez que funcionó, la segunda vez no funcionó. ¿Es posible que haya un problema con el tiempo? ¿Tal vez el DOM no se puede construir lo suficientemente rápido? Probé una AsyncTask, pero eso tampoco ayudó. – 10ff

+0

Bueno, no puedo decir nada como problema con el tiempo o etc. –

+1

por favor, consulte la actualización. –

1

Tiene el mismo problema en Android 3.2. Una solución que funciona para mí (bastante feo) es poner un sueño y llamar a otro LoadURL, tratar con más tiempo si 300ms no es suficiente:

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

tuve el mismo problema con mi proyecto Navegador Mo Da. Añadí estas dos líneas:

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

wvOptions es sólo webview.getSettings() almacenados en una var. La segunda línea parece haber resuelto el problema. La primera línea le da a los usuarios control sobre el tamaño de la página web resultante. Puede agregar la opción "abrir en vista general" si le gustó el resultado. Eso no me ayudó, así que usé la opción de zoom.

+0

'+ 1' OMG estas dos líneas hicieron mi día. Mi ** HTML ** y ** CSS ** se representaban correctamente, pero ** JS ** se cargaba para siempre. Agregué estas dos líneas: 'wvOptions.setBuiltInZoomControls (true);' y 'wvOptions.setUseWideViewPort (true);' y está funcionando ahora. Gracias – fWd82

4

Debe habilitar implícitamente la ejecución de Javascript en su WebView, ya que esto podría causar XSS y otras vulnerabilidades.

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

Además, prefiero poner mi WebViewClient través

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

que me permita restringir el uso de sólo mis sitios.

Cuestiones relacionadas