在安卓WebView中禁用链接

5

首先,我在编程世界中还比较新手,如果我的问题有任何不清晰的地方,请谅解。 我目前正在尝试制作一个应用程序,需要在WebView中无法执行链接 - 或者在另一个浏览器中也是如此。我已经成功将以下两个链接In Android Webview, am I able to modify a webpage's DOM?Titanium Appcelerator Quickie: Disable links in Webview结合起来,并创建了以下可工作的代码:

private class WebClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) 
    {       
        view.loadUrl("javascript:document.body.innerHTML = document.body.innerHTML.replace(/<a.*href=/gi,'<a href=\"#\" _url=');");       
    }
}

上面的代码片段放在onCreate方法之前,并且在onCreate方法中像这样引用:
    viewer = (WebView) findViewById(R.id.wv_engine);
    viewer.setWebViewClient(new WebViewClient());
    viewer.loadUrl(content);

现在,代码可以运行了... 但仅限于请求的网页被加载了第二次之后。第一次执行 WebView 时,example.com 上的所有链接都完好无损,可点击并可执行。使用返回按钮、退出 WebView 并再次进入后,所有链接都变为不可用。

<a href="http://www.example.com">link</a>

to

<a href="#" _url="http://www.example.com">link</a>

现在,我有一个理论,但我并不确定(我不是程序员)。我认为JavaScript执行速度太慢,导致链接操作从未发生。这就是为什么它第二次与缓存一起工作而不是第一次的原因。我从阅读这个讨论中得出了这些想法。但我不知道如何纠正它。
所以我的问题是:我怎样才能确保显示的网站上的任何链接都无法使用?是否有一种方法可以在网站显示之前进行操作?
感谢您的时间和努力。这真是一个令人惊叹的社区 ;)
  • Krede

尝试从shouldOverrideUrlLoading中删除view.loadUrl(url);,这应该会在嵌入式浏览器中显示您已处理该链接,但您什么也没做,没有导航,没有loadUrl - Salw
我删除了这行代码,但是第一次加载的问题仍然存在。正如LAS_VEGAS所指出的那样,我的引用有误。还是谢谢你! - krede85
1个回答

3
我认为这是错误的:
viewer.setWebViewClient(new WebViewClient());

我想你的意思是这个:

我猜你指的是这个:

viewer.setWebViewClient(new WebClient());

这解释了为什么在第一次加载时URL不会被禁用。但我不理解为什么第二次会被禁用。
此外,我认为你应该删除这段话:
view.loadUrl(url);

更新:添加 view.reload(); 导致了一个重载循环。编辑引用并删除 view.loadUrl(url); 是成功的。 - krede85
太棒了,它起作用了!我撤销了关于 view.reload() 的建议。 - Caner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接