在做混合应用的时候经常会遇到加载网页的问题
但是有的时候网页并不一定能完全达到我们的要求,甚至有时候我们会用到其他平台的网页作为外链,但如果直接使用别人的网址,很难符合APP的要求。这个时候就有必要过滤掉其中一些东西了。
达到这个要求的方法还是比较多的:比如说再加载网页之前注入一些JS方法
WKUserScript *getUserScript = [[WKUserScriptalloc]initWithSource:[NSStringstringWithFormat:@"function hideInput() {var x = document.getElementsByTagName('input');x[0].remove();}"]injectionTime:WKUserScriptInjectionTimeAtDocumentStartforMainFrameOnly:NO];
甚至可以使用网络请求道HTML之后用正则过滤掉一些内容再显示,不过WKWebView提供了一个非常方便的方法那就是evaluateJavaScript方法,比如说这样
[webViewevaluateJavaScript:@"document.getElementsByClassName('zx-head-in')[0].remove();document.getElementsByClassName('footer')[0].remove();document.getElementsByClassName('detail-bg mt10 comment')[0].remove();document.getElementsByClassName('detail-bg mt10')[0].remove();document.getElementsByClassName('da-box daBox responsive ui-border-tb')[0].remove();document.getElementsByClassName('ui-share2')[0].remove();document.getElementsByClassName('ui-border-tb prl15')[0].remove();"completionHandler:^(idevaluate,NSError* error) {NSLog(@"---%@",error.domain);}];
这样使用还有一些不足的地方,因为移除控件有一个动画,会出现一闪而过的移除的动画,体验不太好。可以在WKWebView加载内容之前先进行隐藏,然后在block中显示,并且显示的时候要做一个0.5m以上的延时,如下
dispatch_time_tdelayTime =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5/*延迟执行时间*/*NSEC_PER_SEC));
dispatch_after(delayTime,dispatch_get_main_queue(), ^{
_webViews.hidden=NO;
});
OK,完成。
当然WKUserScript有WKUserScript的好处,比如说用WKWebView加载一个登录网页的时候,为了想获得登录账号,就可以这样使用WKUserScript*getUserScript = [[WKUserScriptalloc]initWithSource:[NSStringstringWithFormat:@"function getUser() {var x = document.getElementsByTagName('input');return x[0].value;}"]injectionTime:WKUserScriptInjectionTimeAtDocumentStartforMainFrameOnly:NO];
然后在给手机键盘添加监听方法,每次键盘隐藏的时候就调用getUser方法得到返回结果。当然,在登录成功跳转的时候去调用该方法也是可以的。具体的JS代码就要看具体的H5代码了。
网友评论