gpt4 book ai didi

javascript - 在 Android 的 WebView 中通过 javascript 捕获页面重定向

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:50 26 4
gpt4 key购买 nike

我的应用程序中有一个 WebView,它显示的页面不属于我。我想要的行为是,如果用户点击任何链接,设备的浏览器应用程序将启动,并在那里加载生成的页面。不幸的是,这个页面做了一些奇怪的事情,所以 shouldOverrideUrlLoading() 没有触发。

我尝试的解决方案是将一些 javascript 挂接到 pushState 并使用一个界面来运行 Android 代码以启动浏览器应用程序。

这是我的界面:

public class LaunchExternalBrowserHack {
Context mContext;

LaunchExternalBrowserHack(Context c) {
mContext = c;
}

@JavascriptInterface
public void launchExternalBrowser(String url) {
openUrl(url);
}
}

我在 onPageFinished() 中将一些 javascript 注入(inject)页面:

public void onPageFinished(WebView view, String url) {
mWebView.loadUrl(javascript);
}

这是我的javascript:

private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };";

当然,我正在将界面添加到 WebView:

mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android");

所以这似乎可行。浏览器应用程序正在启动,下一页正在打开。

但是,WebView 也在向前发展。我想阻止这种情况,但我找不到一种方法来阻止 WebView 向前移动,同时仍然允许我捕获转发 url 并启动浏览器应用程序。正如我之前提到的,对于此网页,shouldOverrideUrlLoading 触发。

想法?

最佳答案

用户正试图离开页面。阻止他搬出,返回 false。让他离开,不要返回任何东西,但你可以执行任何你可能想要的代码。当发生导航事件(包括页面刷新)时,会立即触发此事件。

private final String javascript = "window.onbeforeunload = function(){ dosomething(); }; window.unload = function(){ dosomething(); }; function dosomething() { /* Write code here */  };"

您需要包括上面的整个 javascript 代码,因为有些浏览器使用 onbeforeunload 而有些使用 unload

编辑

在仔细阅读您的问题后,我发现我的解决方案没什么用。

这是使用 history 的另一种方法。如果您的历史记录是空白的,则表示它是第一页。但是如果你在历史中有一些项目,那就意味着导航已经发生了。

您可以按如下方式查看

private final String javascript = "javascript:"+"if(window.history.length>=1 && document.referrer=='') Android.launchExternalBrowser(location.href);";

关于javascript - 在 Android 的 WebView 中通过 javascript 捕获页面重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com