如何以编程方式“捕获”对UIWebView的后退和转发请求?

时间:2014-06-18 21:13:32

标签: javascript ios objective-c uiwebview

Javascript调用如下:

history.goBack();
history.goForward();
history.go(-1);

使UIWebView以编程方式向后或向前移动。在发生这种情况之前,我需要一种方法来了解用户的去向。您可能会说该解决方案正在侦听该委托,但是当它来到UIWebView时,没有合法的响应。

当用户点击页面内的“后退”时,会调用此委托方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

它的navigationType设置为 LinkClicked 而不是 BackForward ,正如我们预期的那样。我从UIWebView看到了足够的疯狂甚至一点点惊讶,但对我来说这是一个死胡同的问题。

我有两个主张:

  1. 创建自定义javascript方法“myWayOfGoingBack();”并覆盖所有goBack();方法,所以当它被点击时,我的方法告诉我将要发生什么。
  2. 为上述方法添加一个监听器,但我真的不知道javascript是如何工作的。
  3. 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我知道JavaScript无法使用基于历史记录的事件和信息,因为他们希望防止隐私泄露。因此,您可以告诉浏览器在前进/后退方面如何处理JavaScript,但您无法知道它是否可以实际前进或后退。

如果你在WebView中控制HTML,你可以尝试追求1. People seem to have some succes with it

答案 1 :(得分:0)

我对你的要求感到有些困惑。你有一个用于向用户显示网站的UIWebView,这个网站内置了可点击的后退和前进按钮/链接?是对的吗?这是您控制的网站,还是将其发送到第三方网站?

无论如何,您想知道WebView在加载之前要加载哪个页面。是吗?

问题是(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)没有内置的后退/前进导航类型。如果您愿意,可以保留他们访问的每个页面的全局数组(在webview:function中更新它),然后比较对该列表的任何新请求,以查看他们是否再次访问该页面。或者你可以注入JS来覆盖javascript中的链接功能

NSString* js = @"function reportBackToObjectiveC(string){var iframe = document.createElement('iframe');iframe.setAttribute('src', 'callback://' + string);document.documentElement.appendChild(iframe);iframe.parentNode.removeChild(iframe);iframe = null;}var links = document.getElementsByTagName('a');for (var i=0; i<links.length; i++) {links[i].addEventListener('click', function() {reportBackToObjectiveC('SOMETHING_HAPPENED');}, true);}";
[WebView stringByEvaluatingJavaScriptFromString:js];

(很抱歉,并不是所有的都适合屏幕,它被压缩以使其可注射。你可以复制并粘贴它并稍微扩展它以查看实际发生的情况。)

这将为每个链接添加一个事件监听器,以便在用户单击链接时触发对URL回调的请求:// SOMETHING_HAPPENED。然后,您可以在委托中过滤那些类型的请求,并相应地对其进行操作。

这有帮助吗?或者我错过了这个问题?