问题
在项目中接入了WKWebView,在调试网页的过程中碰到一个问题:
在点击a标签的时候,不会触发webView的navigationDelegate
代理方法,如:
webView:decidePolicyForNavigationAction:decisionHandler:
webView:decidePolicyForNavigationResponse:decisionHandler:
等等,
原本我是在网页加载完成后更新下网页的返回按钮的,这下不起作用了。
a标签的代码
(a标签的事件已经被拦截,网页使用的是vue)
<a class="activity-item-wrapper" href="/activity-detail/588425470926a819f7b8d61d"> </a>
曲线救国
虽然代理方法不会响应,但是经过尝试canGoBack
这个属性的值还是会随着页面的变化而变化的,所以我直接监听这个属性,也可以达到我想要的效果
[self.webView.realWebView addObserver:self forKeyPath:@"canGoBack" options:NSKeyValueObservingOptionNew context:nil];
为什么会出现这种问题
经过请教我司前端的同学后,了解到原网页使用的是H5的History Api,应该是在不刷新页面的情况下切换Url,导致WKWebView没有Call代理方法,但是canGoBack和canGoForward属性是可以检测到的。现在H5的体验越来越好,许多SPA应用都是采用的这种方法。
大概流程:
- 在A页面 通过发AJAX请求 请求页面中的B数据。
- 在页面A中通过JS装载相应的信息到相应的位置来。
- 通过History API在不刷新页面的情况下在浏览器的地址栏中从页面A的URL地址切换到页面B的URL地址。