2012-01-03 42 views
9

Tôi có Hoạt động chỉ có WebView, chứa HTML, CSS và Mã Javascript.Javascript không hoạt động trong Hoạt động webView

Dường như có một vấn đề với truy cập của Javascript với kích thước màn hình về quan điểm. LogCat nói:

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

Khi tôi nhìn vào js-file, có: var f=this.body.getWidth();

điều có tò mò là đôi khi mã làm việc. Các ePaper được hiển thị tốt. Nhưng hầu hết thời gian có lỗi này.

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

Việc bố trí là:

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

tôi đã thay đổi kích thước của WebView vì tôi nghĩ rằng đây có thể là solution..but nó không làm việc với dp một trong hai.

Ai đó có ý tưởng?

Trả lời

16

Set thiết lập này cũng cho WebView của bạn:

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

Đối với chi tiết tham khảo để trả lời ở liên kết sau: ERROR/Web Console: Uncaught TypeError: Cannot call method 'getItem' of null at http://m.youtube.com/:844

Cập nhật: hoặc thêm này có thể giúp:

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

Cảm ơn, nhưng tôi đã thử điều đó rồi. Sai lầm của tôi mà tôi đã xóa nó trong mã.Vì vậy, khi tôi thử nghiệm này, lần đầu tiên nó làm việc, lần thứ hai nó không. Có thể có vấn đề với thời gian không? Có lẽ DOM không thể được xây dựng đủ nhanh? Tôi đã thử một AsyncTask, nhưng điều đó cũng không giúp được gì. – 10ff

+0

Cũng không thể nói bất cứ điều gì như vấn đề với thời gian hoặc vv. –

+1

vui lòng xem cập nhật. –

1

Có cùng sự cố trên Android 3.2. Một giải pháp mà làm việc cho tôi (khá xấu xí) là đặt một giấc ngủ và gọi loadUrl khác, hãy thử với thời gian hơn nếu 300ms là chưa đủ:

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

tôi đã có vấn đề tương tự với dự án trình duyệt Mo Da của tôi. Tôi đã thêm hai dòng này:

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

wvOptions chỉ là webview.getSettings() được lưu trữ trong một var. Dòng thứ hai dường như đã giải quyết được vấn đề. Dòng đầu tiên cho phép người dùng kiểm soát kích thước của trang web. Bạn có thể thêm tùy chọn "mở trong tổng quan" nếu bạn thích kết quả. Điều đó không giúp tôi nên tôi đã sử dụng tùy chọn thu phóng.

+0

'+ 1' OMG hai dòng này làm cho ngày của tôi. ** ** HTML ** và ** ** của tôi đã hiển thị chính xác nhưng ** JS ** đang tải vĩnh viễn. Tôi thêm hai dòng này: 'wvOptions.setBuiltInZoomControls (true);' và 'wvOptions.setUseWideViewPort (true);' và nó hiện đang hoạt động. Cảm ơn bạn – fWd82

4

Bạn nên ngầm kích hoạt thực thi Javascript trong WebView của mình, vì điều này có thể gây ra XSS và các lỗ hổng khác.

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

Ngoài ra, tôi thích thiết WebViewClient tôi qua

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

để cho tôi hạn chế sử dụng chỉ trang web của tôi.

Các vấn đề liên quan