1. 程式人生 > >iOS獲取當前網頁的頁面元素

iOS獲取當前網頁的頁面元素

iOS-獲取當前網頁的 url 和 title 和 html


.h檔案

@property (strong,nonatomic)UIWebView *webView;  
@property (strong,nonatomic)NSString *currentURL;  
@property (strong,nonatomic)NSString *currentTitle;  
@property (strong,nonatomic)NSString *currentHTML;  


.m檔案

-(void) webViewDidFinishLoad:(UIWebView *)webView {  
   [UIApplication sharedApplication].networkActivityIndicatorVisible =NO;  
   self.title =  [webView stringByEvaluatingJavaScriptFromString:@"document.title"];//獲取當前頁面的title  

  self.currentURL = webView.request.URL.absoluteString;  
   NSLog(@"title-%@--url-%@--",self.title,self.currentURL);  

  NSString *lJs = @"document.documentElement.innerHTML";//獲取當前網頁的html  
  self.currentHTML = [webView stringByEvaluatingJavaScriptFromString:lJs];  
}


iOS使用正則表示式去掉html中的標籤元素,獲得純文字

//content是根據網址獲得的網頁原始碼字串

NSRegularExpression *regularExpretion=[NSRegularExpression regularExpressionWithPattern:@"<[^>]*>|\n"
                                                                                   options:0
                                                                                     error:nil];

//替換所有html和換行匹配元素為"-"

   content=[regularExpretion stringByReplacingMatchesInString:content 
                                                                         options:NSMatchingReportProgress 
                                                                            range:NSMakeRange(0, content.length) withTemplate:@"-"];

//把多個"-"匹配為一個"-"

   regularExpretion=[NSRegularExpression regularExpressionWithPattern:@"-{1,}" options:0 error:nil] ;
   content=[regularExpretion stringByReplacingMatchesInString:content
                                                                                     options:NSMatchingReportProgress 
                                                                                        range:NSMakeRange(0, content.length) withTemplate:@"-"];

//根據"-"分割到陣列

   NSArray *arr=[NSArray array];
   content=[NSString stringWithString:content];
   arr =  [content componentsSeparatedByString:@"-"];
   NSMutableArray *marr=[NSMutableArray arrayWithArray:arr];
   [marr removeObject:@""];
   return  marr;


iOS 獲取UIWebView上面的按鈕點選事件

很多文章都說iOS的UIWebView比較耗記憶體,在我的專案中,最開始我也是用UIWebView來載入網頁的。剛開始載入的是自己拼接成的Html,後來在Html中加入一個按鈕,點選之後用當前的UIWebView去載入網路上的網頁。程式跑起來發現非常耗記憶體,載入幾個網上的網頁之後就爆記憶體警告了,不處理的話很容易被評估拒掉app。後來就改成用系統的safari瀏覽器來開啟網路上的網頁,把著耗記憶體的工作交給蘋果自己自帶的瀏覽器來處理,就避免了我這個app crash。但是怎麼獲取網頁上這個按鈕點選的事件呢,這個按鈕本身就綁定了一個url,怎麼讓它點選之後當前的UIWebView不去load這個url呢。

後來查了一下資料,發現UIWebView的協議裡面有這麼個方法,可以獲取它載入的網頁上面的事件,比如單擊了圖片,單擊了按鈕等等。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
//判斷是否是單擊
   if (navigationType == UIWebViewNavigationTypeLinkClicked)
   {
       NSURL *url = [request URL];
       if([[UIApplication sharedApplication]canOpenURL:url])
       {
           [[UIApplication sharedApplication]openURL:url];
       }
       return NO;
   }
   return YES;
}

拼接的Html最後加的按鈕的方法如下:
File:Dev_2014_08_14_qinyk_webview1.jpg

這樣寫了之後,點選按鈕之後就不會用當前的UIWebView來載入網路上的網頁,而是呼叫系統的Safari來開啟。

注意:最後一點要返回YES,否則UIWebView剛開始將一片空白,這是因為第一次載入的時候也是UIWebView請求一個連結,如果返回NO,就不會去載入了。還可以對url的內容進行判斷,看是什麼請求。

介面,如果為webView添加了delegate物件並實現該介面,那麼在webView載入任何一個frame之前都會delegate物件的該方法,該方法的返回值用以控制是否允許載入目標連結頁面的內容,返回YES將直接載入內容,NO則反之。並且UIWebViewNavigationType列舉,定義了頁面中使用者行為的分類,包括

  1. UIWebViewNavigationTypeLinkClicked,使用者觸擊了一個連結。
  2. UIWebViewNavigationTypeFormSubmitted,使用者提交了一個表單。
  3. UIWebViewNavigationTypeBackForward,使用者觸擊前進或返回按鈕。
  4. UIWebViewNavigationTypeReload,使用者觸擊重新載入的按鈕。
  5. UIWebViewNavigationTypeFormResubmitted,使用者重複提交表單
  6. UIWebViewNavigationTypeOther,發生其它行為。