And*_*rew 11 javascript android android-webview
我的应用程序中有一个WebView,显示不属于我的页面.我希望的行为是,如果用户点击任何链接,则启动设备的浏览器应用程序,并在那里加载生成的页面.不幸的是,这个页面正在做一些奇怪的事情,所以shouldOverrideUrlLoading()不要开火.
我尝试的解决方案是将一些javascript挂钩到pushState并使用界面运行Android代码来启动浏览器应用程序.
这是我的界面:
public class LaunchExternalBrowserHack {
Context mContext;
LaunchExternalBrowserHack(Context c) {
mContext = c;
}
@JavascriptInterface
public void launchExternalBrowser(String url) {
openUrl(url);
}
}
Run Code Online (Sandbox Code Playgroud)
我在页面中注入了一些javascript onPageFinished():
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl(javascript);
}
Run Code Online (Sandbox Code Playgroud)
这是我的javascript:
private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };";
Run Code Online (Sandbox Code Playgroud)
当然,我正在添加界面WebView:
mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android");
Run Code Online (Sandbox Code Playgroud)
所以这似乎有效.浏览器应用程序正在启动,下一页正在打开.
但是,WebView也在向前发展.我想阻止这一点,但我找不到阻止WebView向前移动的方法,同时仍然允许我捕获转发URL并启动浏览器应用程序.正如我之前提到的,使用这个网页,shouldOverrideUrlLoading并没有解雇.
想法?
用户正试图离开页面.阻止他搬出去,返回假.让他离开,不要返回任何东西,但你可以执行任何你可能想要的代码.发生导航事件(包括页面刷新)时会立即触发此事件.
private final String javascript = "window.onbeforeunload = function(){ dosomething(); }; window.unload = function(){ dosomething(); }; function dosomething() { /* Write code here */ };"
Run Code Online (Sandbox Code Playgroud)
您需要包含上面的整个javascript代码,因为某些浏览器使用onbeforeunload并且有些使用unload
编辑
在仔细阅读了您的问题之后,我发现我的解决方案没什么用处.
这是另一种使用方法history.如果您的历史记录为空白,则表示其为第一页.但如果您在历史记录中有一些项目,则表示已进行导航.
你可以检查如下
private final String javascript = "javascript:"+"if(window.history.length>=1 && document.referrer=='') Android.launchExternalBrowser(location.href);";
Run Code Online (Sandbox Code Playgroud)
这个答案是错误的。保留在这里是因为它有重要的相关评论。
您没有从 Javascript 中获得结果的原因是您没有直接调用函数。您在 Javascript 中分配了一个返回值的函数,但它不会将其返回到您的代码,而是将其返回到任何调用history.pushState()。
private final String javascript = "javascript:" + "var pushState = history.pushState; history.pushState = function () " +
"{ pushState.apply(history, arguments); console.log(arguments); return location.href; " +
"};";
Run Code Online (Sandbox Code Playgroud)
相反,您可以测试类似的内容是否返回一个值:
private final String javascript = "(function() { return location.href; })();";
Run Code Online (Sandbox Code Playgroud)