我正在开发的Android应用程序依赖于一个网页来实现其大部分功能。当用户单击通常调用window.open的链接时,我希望它改为调用自定义函数。这样它就可以阻止应用程序打开浏览器窗口,这会破坏使用应用程序的错觉。我已经设置了JavaScriptInterface来替换它在页面中找到的window.open的所有实例。我现在遇到的问题是外部javascript文件。它的功能与此非常相似
function LoadItem(url,title)
{
window.open("/items.html?item=" + url + "&title=" + EncodeString(title), "song: " + title);
}
我想解决它,所以反而是这样:
function LoadItem(url,title)
{
window.LinkFixer.openInNewTab("/items.html?item=" + url + "&title=" + EncodeString(title), "song: " + title);
}
这是我到目前为止的代码应该为我做这个。
public String processPage(String html)//called once the page has been loaded
{
html = html.replace("window.open","window.LinkFixer.openInNewTab").replace("OpenSong","window.LinkFixer.openSong");
String[] lines = html.split("\n");
html = "";
for(int i=0;i<lines.length;i++)
{
if(lines[i].contains("<script")&&lines[i].contains("src="))
{
lines[i] = getJs(lines[i]);
}
html += lines[i];
}
return html;
}
private String getJs(String line)//gets the javascript, fixes it so it's safe for the app, then returns it as inline rather than embeded
{
String jsFileName = line.replace("\"","'").replace("<script type='text/javascript' ","").replace("src=","").replace(">","").replace("'","").trim();
//public static String makeGetRequest(String url,boolean oneLine)
System.out.println(jsFileName);
String targetUrl = "/BrowserControl/"+jsFileName;
System.out.println(targetUrl);
String jsFile = ShowWebInterface.makeGetRequest(targetUrl,false);
Log.d("OrigFile"+jsFileName,jsFile);
jsFile = jsFile.replace("window.open","window.LinkFixer.openInNewTab").replace("OpenSong","window.LinkFixer.openSong").replace("function window.LinkFixer.openSong(url, title)","window.LinkFixer.openSong");
Log.d("NewFile"+jsFileName,jsFile);
return "<script type=\"text/javascript\">\n"+jsFile;
}
首次点击,它有效。对于之后的任何事情,它会在我的应用程序控制之外的浏览器窗口中加载页面。我遇到问题的页面确实使用了ajax,所以我很确定这会引起某种问题。我认为浏览器仍会调用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))");
}
}
});
有什么我想念的吗?一些劫持ajax回调函数的方法?或者也许是我忽略的其他事情。
答案 0 :(得分:2)
我相信你应该使用shouldOverrideUrlLoading(...)
How to make links open within webview or open by default browser depending on domain name?似乎有一个很好的例子。