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

Android 页面加载完成后,在JavascriptInterface中执行方法,android,webview,android-webview,Android,Webview,Android Webview,我希望能够在页面呈现给我的应用程序用户之前,对页面的html和javascript进行一些处理。该页面对所有链接使用window.open,这会导致打开一个不受我的应用程序控制的新浏览器窗口,从而破坏使用应用程序的错觉。这就是我现在所拥有的,我认为这将在很大程度上起作用 class LinkFixer { static HashMap<String,String>pages = new HashMap<String,String>();//static so mu

我希望能够在页面呈现给我的应用程序用户之前,对页面的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
类链接修复程序
{
static HashMappages=new HashMap();//静态,以便多个页面可以访问它
公共void进程页(字符串html)
{
html=html.replace(“window.open”、“LinkFixer.openInNewTab”);
}
public void openInNewTab(字符串url、字符串targetName)
{
如果(!pages.containsKey(targetName))///targetName对于每个链接都是唯一的
{
pages.put(targetName,url);
//将新选项卡添加到我的TabHost,它将包含一个Web视图,其中加载了来自url的页面
}
//将用户移动到选项卡
}
}
WebView浏览器=(WebView)findViewById(R.id.browser);
browser.getSettings().setJavaScriptEnabled(true);
addJavascriptInterface(新的LinkFixer(),“LinkFixer”);
browser.loadUrl(“http://serverIP:port/mobilecontrol.html");
//使浏览器执行LinkFixer.processPage的内容如下

我将遇到的问题是,我不确定在页面完成加载后如何使页面执行LinkFixer.processPage。除此之外,我认为代码会起作用。有什么建议吗?

我制作了一个新的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))");
            }
        }
    });

这正是我希望它的工作方式

我制作了一个新的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))");
            }
        }
    });
这正是我想要的