页面加载完成后,在JavascriptInterface中执行方法

时间:2012-04-02 17:14:43

标签: android webview android-webview

我希望能够在将页面的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。除此之外,我认为代码将起作用。有什么建议吗?

1 个答案:

答案 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))");
            }
        }
    });

这正是我想要的方式

相关问题