2014-09-01 113 views
0
class MyJavaScriptInterface 
{ 
    @SuppressWarnings("unused") 
    public void processHTML(String html) 
    { 
    // process html 
    } 
} 

final WebView browser = (WebView)findViewById(R.id.browser); 
browser.getSettings().setJavaScriptEnabled(true); 

browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 

browser.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) 
    { 
    new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');"); 
    } 
    }, 2000); 
} 
}); 

browser.loadUrl("someurl"); 

我想要實現的是僅當頁面上加載了所有JavaScript(通常在發生onPageFinished後的2-3秒)時才調用processHTML方法。Android:加載所有腳本後從頁面抓取HTML

我發現粗魯的解決方案是使用延遲處理程序,但我會問是否有方法知道何時加載所有腳本。

我可以循環該處理程序,直到我找不到我想要的信息,但它似乎不是一個優雅的解決方案。

回答

0

這個怎麼樣:

webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer"); 
    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      new Thread(){ 
       public void run(){ 
        try {sleep(2000); } catch(Throwable t){} //change 2 000 ms if you want 
        runOnUiThread(new Runnable(){ 
         public void run() { 
          webview.loadUrl("javascript:window.HtmlViewer.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');"); 
         } 
        } 
      }}.start(); 
     } 
    }); 

class MyJavaScriptInterface { 
    MyJavaScriptInterface(Context ctx) { 
    } 
    @JavascriptInterface //add this, if your target api is higher than 17 
    public void showHTML(String html) { 
     //html is your code 
    } 
} 

來源:how to get html content from a webview?

你不能得到的信息,是加載的所有腳本。有些腳本(例如在線stoper)總是使用JavaScript,它不會結束。 (對我的英文不好)s