WKWebView无法打开某些带有target="_blank"属性的链接

4
我已经实现了这里所接受的解决方案,它可以适用于一些网站。例如:访问www.tomcruise.com并单击他的预告片,这些链接中的每一个都有target="_blank",在实现先前链接的堆栈溢出文章中建议的解决方案后开始打开。

但是我现在发现,如果我们在此处单击任何链接(截至撰写本问题时,我尝试的链接的href标记如下:

 <a rel="nofollow" target="_blank" href="http://www.nowmagazine.co.uk/celebrity-news/victoria-and-david-beckham-fighting-to-be-together-296082" class="ot-anchor aaTEdf" jslog="10929; track:click" dir="ltr">http://www.nowmagazine.co.uk/celebrity-news/victoria-and-david-beckham-fighting-to-be-together-296082</a>

当我从WKWebView中点击此链接时,下面的WKUIDelegate方法确实被调用,但navigationAction.request="",因此当webView.loadRequest("")被调用时什么也不会发生。还有其他人遇到这个问题吗?
  optional func webView(_ webView: WKWebView, createWebViewWithConfiguration configuration: WKWebViewConfiguration,
       forNavigationAction navigationAction: WKNavigationAction,
            windowFeatures windowFeatures: WKWindowFeatures) -> WKWebView?{
      if navigationAction.targetFrame == nil {
          webView.loadRequest(navigationAction.request)
      }

      return nil
}
  • 以上指定的 href 标签有什么特殊之处,导致 WKUIDelegate 方法被调用时 url 为空?
  • 我们该如何解决这个问题?请告诉我您是如何找到问题根源的,我也很感兴趣调试。

对我来说,你使用的解决方案有效。此外,你链接的 Google Plus 页面也可以访问。现在杂志的链接对我也有效。 - user5087998
1个回答

4

我希望能够通过WKWebView的委托方法来解决这个问题,但我无法弄清楚。

因此,我采用了UIWebView时代的解决方案,在网页加载完成后运行Javascript函数。

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    let jsCode = "var allLinks = document.getElementsByTagName('a');if (allLinks) { var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target');if (target && target == '_blank') {link.setAttribute('target','_self');} } }"
    webView.evaluateJavaScript(jsCode, completionHandler: nil)
}

这个修复了在任何Google+帖子页面上点击链接导致加载空白页面的问题。


2015年11月3日更新:在Swift 2.0代码中,我不再遇到本问题。因此,您应该能够将这里提供的解决方案用于所有目的。


我有类似的问题,但你的解决方案对我不起作用。我是JS的新手,你能否请看一下我面临的问题:https://stackoverflow.com/questions/59862536/wkwebview-gives-blank-navigationaction-request-for-some-links-with-target-blank。 - Tarun Tanwar
感谢 - Swift 5.3,ios14,2020年 - 这段代码仍然有效。可恶的WKWebView又坏了。 - Deian

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