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

在页面加载完成后在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))"); 
      } 
     } 
    }); 

其中一期工程正是我希望它