如上所示
要隱藏切換賬號(hào)這個(gè)按鈕
解決辦法如下圖
[webView evaluateJavaScript:@"document.getElementsByClassName('tcaptcha-iframe')[0].hidden = true;" completionHandler:^(id result, NSError *error) {
NSLog(@"01隱藏web控件 %@ \n\n %@",result,error);
lengthString = result;
}];
(也可以單引號(hào))
(這個(gè)方法缺點(diǎn)是必須等頁面加載完成之后才可以調(diào)用隱藏,頁面會(huì)先顯示出來要隱藏的控件会放,加載完成之后才可以實(shí)施隱藏)
參考: https://www.cnblogs.com/aaalice/p/4222918.html
https://www.cnblogs.com/leonlincq/archive/2019/01/25/10322030.html
https://www.cnblogs.com/beijingxiaoguo/p/4152606.html(里面有更好的解決辦法,頁面內(nèi)容如下)
「前幾天因?yàn)閿?shù)據(jù)中加載有html語言的數(shù)據(jù)捣鲸,關(guān)于html語言和UIWebView媒役,有一些糾結(jié)只锻,經(jīng)過幾天的研究,也有了一些自己的簡單的見解崇裁。
我有兩個(gè)頁面需要加載html語言(注意匕坯,這里面的html不是從json解析出來的一段html語言,而是整個(gè)網(wǎng)站拔稳,然后用谷歌的開發(fā)者工具可接看到網(wǎng)站的源碼)葛峻,這段html語言顯示的內(nèi)容包括排版還是比較好的,所以我想直接把這個(gè)網(wǎng)站加載到我的程序上壳炎,但是由于是別的的數(shù)據(jù)泞歉,概覽上面有一段我不想要的數(shù)據(jù),滾動(dòng)視圖的詳情頁面有我很多不想要的數(shù)據(jù)匿辩,所以我就想到了把這段不想要的代碼給刪除掉腰耙。所以我想到了兩個(gè)辦法(網(wǎng)頁的源碼我們是無法直接的刪除的),第一個(gè)铲球,我利用UIWebView的js交互的方法挺庞,用dom語言把這一段給隱藏掉(例如: [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName(\"m-app-download\")[0].hidden = true;"];),這段代碼只有在UIWebView請(qǐng)求結(jié)束的時(shí)候使用才比較好稼病,所以在加載的時(shí)候會(huì)先出現(xiàn)你不想要的那一部分选侨,然后請(qǐng)求加載完成了之后(用的loadrequest請(qǐng)求)才會(huì)隱藏掉,所以還是達(dá)不到預(yù)期的效果然走;第二個(gè)辦法援制,把整個(gè)后臺(tái)的數(shù)據(jù)轉(zhuǎn)換成字符串,然后刪除或者修改我不想要的那一部分(例如:1\. NSString * dataString = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",webUrl]] encoding:NSUTF8StringEncoding error:nil]; 2\. dataString = [dataString stringByReplacingOccurrencesOfString:@"\"m-app-download\"" withString:@"”]; 3. [self.webView loadHTMLString:dataString baseURL:nil];)芍瑞,經(jīng)過這三部晨仑,也能達(dá)到預(yù)期的效果,但是會(huì)存在一個(gè)問題,有點(diǎn)卡洪己,暫時(shí)先不處理這妥凳,最起碼達(dá)到了要求。
然后我滿懷欣喜的去處理滾動(dòng)視圖上的鏈接答捕,這個(gè)地方要比概覽的網(wǎng)站大的多逝钥,加載的東西也非常多,我就利用第二種方法去處理它拱镐,因?yàn)槲业诙N方法是處理字符串艘款,當(dāng)我看到這個(gè)地方的字符串的時(shí)候,因?yàn)橛蟹浅6嗟孟嗨频牡胤搅≌荆址茈y去處理磷箕,又一次陷入了糾結(jié),所以我想到一個(gè)比較懶的方法阵难,我現(xiàn)在視覺上讓上面的我不想要的隱藏(因?yàn)檫@段字符串處理起來比較的簡單)岳枷,然后下面的我等請(qǐng)求結(jié)束后,在用dom給隱藏掉不就行了呜叫,然后繼續(xù)做空繁,后來成功了。
然后我以為是大功告成了朱庆,可是在測(cè)試的時(shí)候盛泡,我進(jìn)入滾動(dòng)頁面詳情的時(shí)候,非常極其的卡娱颊,后來就思考這是為什么傲诵,然后想到了一個(gè)原因,是不是UIWebView的加載的網(wǎng)站過大箱硕,再加上UIWebView的內(nèi)存不能釋放所造成的层玲,然后我開始想這個(gè)解決辦法勾栗,那不用UIWebView不就行了炎功,然后我就想到了以前看到的一個(gè)第三方類(TFHpple)用來過濾html的標(biāo)簽一膨,來獲取自己想要的那一部分,所以就開始研究TFHpple惠昔,后來才知道過濾標(biāo)簽需要用到XPath語言(一種過濾xml和html的語言)(關(guān)于XPath的一些知識(shí)http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html)幕与,后來經(jīng)過一段時(shí)間的學(xué)習(xí)很快的掌握了這一個(gè)知識(shí)點(diǎn)(例:使用過程:1.導(dǎo)入 #import “TFHpple.h" #import “TFHppleElement.h" #import “XPathQuery.h” 2.添加一個(gè)庫,這個(gè)庫是:libxml2.2.dylib镇防。并且還需要設(shè)置一些路徑參數(shù)啦鸣,否則會(huì)一直報(bào)錯(cuò);這個(gè)路徑的設(shè)置来氧,在 targets中赏陵,在build settings搜索Header Search Paths饼齿,將debug和release設(shè)置不同的值; debug的值設(shè)置成:/usr/include/libxml2 release的值設(shè)置成:${SDKROOT}/usr/include/libxml2 3. 將html語言轉(zhuǎn)換成data蝙搔, NSString *dataString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://breadtrip.com/mobile/destination/topic/2387718792/"] encoding:NSUTF8StringEncoding error:nil];
NSData *htmlData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 4.書寫XPath過濾語句: NSString *nodeString = @"http://section//dl";
NSString *nodeString = @"http://p[@class="double-line"]";
NSString * nodeString = @"http://dd[a[@class=\"pic\"]]//img"; //所有的圖片
NSString * nodeString = @"http://div[@class=\"info\"]//p[@class=\"summary\"][1]"; //獲得所有的文字,15段文字
NSString * nodeString = @"http://dd[div[@class=\"info\"]]//a[@class=\"pic\"]//img";
NSString * nodeString = @"http://header//img”;等等
5.獲得想要的那個(gè)對(duì)象: TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
NSArray *elements = [xpathParser searchWithXPathQuery:nodeString];(注意數(shù)組里面裝得是 TFHppleElement對(duì)象考传, 這樣可以打印出來NSString * string = ele.attributes[@"src”]; NSLog(@"%@",string);))然后接卸終于結(jié)束了吃型,獲得數(shù)據(jù)進(jìn)行簡單的布局,這樣布局的時(shí)候就不會(huì)有UIWebView那么好看的界面了僚楞,很可惜勤晚。
后來開始加載頁面,本來以為問題已經(jīng)解決掉了泉褐,可是還是非常的卡赐写,這是為什么呢,接著就思考原因然后檢查我的代碼膜赃,這些方法都有( NSString * dataString = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",webUrl]] encoding:NSUTF8StringEncoding error:nil];)這段代碼挺邀,測(cè)試后這段代碼的耗時(shí)是非常長的,而且這段代碼是在主線程來加載的所以跳座,會(huì)非常的卡端铛,終于找到了原因,所以就果斷的用GCD開辟一條線程去加載數(shù)據(jù)
創(chuàng)建一個(gè)串行異步線程(串行異步能保證效率疲眷,又能控制它在異步線程上的執(zhí)行順序禾蚕,所以用這個(gè)),然后回到主線程更新UI界面(self.hud是加載時(shí)候的蒙版)狂丝,不出所料换淆,果然非常的快了,各種快几颜。后來想既然這樣那么UIWebView應(yīng)該也沒有問題倍试,所以上面的代碼改成了UIWebView去loadHTMLString,發(fā)現(xiàn)依舊非常的快菠剩,而且界面的問題也保證了易猫,果斷欣喜。后來我有進(jìn)行了瘋狂的點(diǎn)擊測(cè)試具壮,發(fā)現(xiàn)沒有問題准颓,而且很快,但是就在點(diǎn)擊了100多次左右棺妓,系統(tǒng)打印了內(nèi)存警告的提示攘已,后來一想,這是對(duì)的怜跑,因?yàn)閁IWebView創(chuàng)建后的內(nèi)存不能夠釋放样勃,就算你退出了也不能釋放吠勘,所以這個(gè)地方,當(dāng)很多次的創(chuàng)建就可能導(dǎo)致內(nèi)存警告(離著閃退還有一段距離)峡眶,所以這個(gè)地方還得用TFHpple解析(很搓的界面是wufa避免了剧防,我還是偷懶先用著UIWebVIew吧)。
總結(jié):問題需要多方面的qu考慮辫樱,當(dāng)遇到卡頓的時(shí)候峭拘,應(yīng)該首先想到的就是線程的問題,在滿足了功能的要求之后狮暑,應(yīng)該還要站在用戶的角度上去思考問題鸡挠,比如內(nèi)存問題,體驗(yàn)問題等等搬男,這個(gè)地方走了很多的彎路拣展,但是也學(xué)到了很多的知識(shí),所以說是值得的缔逛。慢慢的積跬步然后去致千里备埃。」