在页面加载完成后在JavascriptInterface中执行方法
问题描述:
我希望能够在呈现给我的应用的用户之前,对页面的html和javascript做一些处理。该页面对所有链接使用window.open,并导致一个不受我的应用程序控制的新浏览器窗口被打开,这破坏了使用应用程序的错觉。这就是我现在所拥有的,我认为这在大多数情况下都会起作用。在页面加载完成后在JavascriptInterface中执行方法
class LinkFixer
{
static HashMap<String,String>pages = new HashMap<String,String>();//static so multiple pages can access it
public void processPage(String html)
{
html = html.replace("window.open","LinkFixer.openInNewTab");
}
public void openInNewTab(String url, String targetName)
{
if(!pages.containsKey(targetName))//targetName is unique for every link
{
pages.put(targetName,url);
//add new tab to my TabHost, which will contain a WebView with page from url loaded
}
//move user to tab
}
}
WebView browser = (WebView)findViewById(R.id.browser);
browser.getSettings().setJavaScriptEnabled(true);
browser.addJavascriptInterface(new LinkFixer(), "LinkFixer");
browser.loadUrl("http://serverIP:port/mobilecontrol.html");
//something to make the browser execute LinkFixer.processPage goes here
我会用它,问题是,我不知道我怎么会做网页执行LinkFixer.processPage当网页加载完成。除此之外,我认为代码将起作用。有什么建议么?
答
我完成了一个新的WebChromeClient并覆盖了onProgressChanged方法来修复newProgress为100或更大后的链接。
browser.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView webView, int newProgress)
{
super.onProgressChanged(webView,newProgress);
if(newProgress >= 100)
{
System.out.println("Done loading");
browser.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].innerHTML = window.LinkFixer.processPage((document.getElementsByTagName(\"html\")[0].innerHTML))");
}
}
});
其中一期工程正是我希望它