我希望能够在将页面的html和javascript呈现给我的应用程序用户之前对其进行一些处理。该页面对所有链接使用window.open,这会导致打开一个不受我的应用程序控制的新浏览器窗口,这会破坏使用应用程序的错觉。这就是我现在所拥有的,我认为这在大多数情况下都会起作用。
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。除此之外,我认为代码将起作用。有什么建议吗?
答案 0 :(得分:1)
我创建了一个新的WebChromeClient,并在newProgress为100或更高版本之后重写了onProgressChanged方法来修复链接。
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))");
}
}
});
这正是我想要的方式