问题描述 :iOS的WKWebView内核下,a链接带有target=”_blank”时,链接点不开
是时候迁移到WKWebView来了,github上兼容UIWebView的第三方浏览器也是一大把。WKWebView重构了webView给开发者带来更多灵活性同时,也会出现一些初看起来莫名其妙的问题。
_blank
就是其中之一
本文讨论的是当html源代码中,一个可点击的标签带有 target='_blank'
时,导致WKWebView无法加载点击后的网页的问题。
如果你发现你的WKWebView中的网页,点击某个按钮无反应。就看看这个吧。
_blank 标签,众所周知,是让浏览器新开一个页面来打开链接,而不是在原网页上打开。
在UIWebView上,只有一个页面,所以会自动在原来的页面上打开新链接。
但是在WKWebView上就不是这样了。
WKWebView 的 WKNavigationDelegate 有一个方法。
-(void)webView:(WKWebView )webView decidePolicyForNavigationAction:(WKNavigationAction )navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
用户点击网页上的链接,需要打开新页面时,将先调用这个方法。
这个方法的参数 WKNavigationAction
中有两个属性:sourceFrame和targetFrame,分别代表这个action的出处和目标。类型是 WKFrameInfo 。WKFrameInfo有一个 mainFrame 的属性,正是这个属性标记着这个frame是在主frame里还是新开一个frame。
如果 targetFrame 的 mainFrame 属性为NO,表明这个 WKNavigationAction 将会新开一个页面。
WKWebView遇到这种情况,将会调用 它的 WKUIDelegate 代理中的
-(nullable WKWebView )webView:(WKWebView )webView createWebViewWithConfiguration:(WKWebViewConfiguration )configuration forNavigationAction:(WKNavigationAction )navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
方法。
开发者实现这个方法,返回一个新的WKWebView,让 WKNavigationAction 在新的webView中打开。如果你没有设置 WKUIDelegate代理,或者没有实现这个协议。那么WKWebView将什么事情都不会做,也就是你点那个按钮没反应。
注意:返回的这个WKWebView不能和原来的WKWebView是同一个。如果你返回了原来的webView,将会抛出异常。
apple设置这个协议的作用就是要求开发者新开一个webView。但实际使用中,我们的应用中webView也就拿来简简单单显示网页罢了,写那么复杂没必要。
所以解决办法1:
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
WKFrameInfo *frameInfo = navigationAction.targetFrame;
if (![frameInfo isMainFrame]) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
这样处理的话,相当于放弃掉原来的点击事件,强制让webView加载打开的链接。
原来我就是这么做的,直到:http://www.soku.com/m/y/video?q=阿凡达%20片段#loaded 这个优酷链接。
这个链接里,点击某个视频,将会新开页面打开。然后在这个协议方法里,navigationAction.request 竟然是空的!request的URL是空的!
所以解决办法2:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
if (!navigationAction.targetFrame.isMainFrame) {
[webView evaluateJavaScript:@"var a = document.getElementsByTagName('a');for(var i=0;i<a.length;i++){a[i].setAttribute('target','');}" completionHandler:nil];
}
decisionHandler(WKNavigationActionPolicyAllow);
}
在这里,将网页上所有的_blank标签都去掉了。一劳永逸。。。。。。
移动端为什么要设置`max-width:640px`或`max-width:750px`,这个主要是受设计稿的影响,如果设计稿是`640px`,那么`max-width`值就设置640px,那可以设置740px吗?可以,但是因为设计稿是640px,当页面740px宽度时,图片会失真。
flutter环境安装及各种问题
iphone下不支持document.on('click')事件
最近一直在持续的学习 Flutter,但一直没有发现有好用的网络调试工具,也不想太想使用 Charles 这个工具,后来发现了Facebook Flipper 这个工具,所以花了几天时间做了个 Flutter 版的 Flipper SDK。期间碰到了一些问题但 Flipper 项目的人迅速的帮忙。
今天我们就来看一下如何使用 Agora Flutter SDK 快速构建一个简单的移动跨平台视频通话应用。
问题描述 :iOS的WKWebView内核下,a链接带有target="_blank"时,链接点不开
本文所说`devicePixelRatio`其实指的是`window.devicePixelRatio`, 被所有WebKit浏览器以及Opera所支持,随着显示器的发展,这个属性也慢慢登上了前端技术的舞台。