我正在编写一款应用程序,它具有以下功能:
- 在Webview中加载URL;
- 通过JavaScript代码提取HTML;
- 在LOG中显示提取的HTML代码。
由于需要在未启用JavaScript的情况下加载页面(以避免某些页面的行为),我尝试了下面的代码,其中: - 禁用JavaScript的情况下在webview中加载页面; - 页面加载完成后,启用JavaScript; - 然后,应用程序执行提取HTML代码所需的JavaScript。
不幸的是,在Android 4.0.4上以调试模式运行代码时,会出现错误:
如果我移除
我该如何让下面的代码正常工作?
由于需要在未启用JavaScript的情况下加载页面(以避免某些页面的行为),我尝试了下面的代码,其中: - 禁用JavaScript的情况下在webview中加载页面; - 页面加载完成后,启用JavaScript; - 然后,应用程序执行提取HTML代码所需的JavaScript。
不幸的是,在Android 4.0.4上以调试模式运行代码时,会出现错误:
01-22 22:37:56.575: E/Web Console(7605): Uncaught TypeError: Cannot call method 'processHTML' of undefined at null:1
如果我移除
myBrowserSettings.setJavaScriptEnabled(false);
声明,在loadurl调用后,一切都会正确地运行。我该如何让下面的代码正常工作?
package com.stefano.formfiller;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebSettings.PluginState;
public class MainActivity extends Activity {
WebView myBrowser;
String urlToBrowse = "http://www.mywebsite.com";
String htmlCode = null;
StringBuffer buffer = new StringBuffer();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myBrowser = (WebView)findViewById(R.id.webView1);
//Browser settings
WebSettings myBrowserSettings = myBrowser.getSettings();
//Prevent cache to be used
myBrowserSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
myBrowserSettings.setAppCacheEnabled(false);
//General settings
myBrowserSettings.setJavaScriptEnabled(true);
Log.d("Stefano", "JS enabled");
//FIREFOX user agent
myBrowserSettings.setUserAgentString("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
myBrowser.setWebChromeClient(new WebChromeClient());
myBrowser.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url)
{
WebSettings myBrowserSettings = myBrowser.getSettings();
myBrowserSettings.setJavaScriptEnabled(true);
Log.d("Stefano", "JS enabled");
Log.d("Stefano", "OnPageFinished running");
} });
//Start the delayed HTML code extraction
delayedStartHtmlExtractor(16000);
Log.d("Stefano", "DelayedStart HTML Extractor launched");
//Prepare Javascript to extract the HTML code from the webview
myBrowser.addJavascriptInterface(new LoadListener(), "HTMLOUT");
myBrowser.loadUrl(urlToBrowse);
Log.d("Stefano", "Main URL requested");
myBrowserSettings.setJavaScriptEnabled(false);
Log.d("Stefano", "JS disabled");
}
//Delayed HTML extraction
public void delayedStartHtmlExtractor(final int delay){
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
myBrowser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
Log.d("Stefano", "HTML extraction launched");
}
}, delay);
}
//Insert the HTML code in the log information
class LoadListener{
public void processHTML(String html)
{
Log.d("Stefano", "HTML Extraction in progress...");
Log.e("HTML CODE",html);
}
}
更新: 我有一个疑问:代码在启用Javascript(通过myBrowser.addJavascriptInterface(new LoadListener(), "HTMLOUT");)时实例化了Javascript接口,然后,在URL调用后禁用Javascript,直到页面完全加载后再重新启用Javascript。
当我使用已实例化的接口禁用Javascript时,是否会“切断”Javascipt和Java代码之间的通信渠道?