본문 바로가기

IT/iOS

UIWebView의 로드된 웹페이지에 JavaScript 소스 넣기 또는 수정, 삭제 하기(target:'_blank')

UIWebView에서 특정 링크에대해 개별적인 처리를 하려고했다.

그 특정링크는 targer:'_blank' 속성을 가진 녀석을 safari로 링크를 돌리려고했다. 

하지만 앱상에서 해당 웹뷰의 웹페이지 속성을 불러올수 있는 방법을 못찾다가 다음과 같은 방법으로 해결했다.

해당 웹페이지의 javaScript 속성을 변경하는것.

    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        NSString *js = @"\
        var d = document.getElementsByTagName('a');\
        for (var i = 0; i < d.length; i++) {\
        if (d[i].getAttribute('target') == '_blank') {\
        d[i].removeAttribute('target');\
        d[i].setAttribute('href', d[i].getAttribute('href') + '&+?open_safari=1');\
        }\
        }\
        ";
        [webView stringByEvaluatingJavaScriptFromString:js];
    }
소스의 내용은 다음과 같다. 
NSString에 javascript코드를 넣는데 tagname a를 가진 모든 도큐먼트를 가져와서 하나하나 씩 target:'_blank'속성이 있는지는 찾는다.

찾게 되면 해당 도큐먼트에 'href'속성에 임의로 open_safari=1라는 주소를 추가한다. 

그리고 해당 web뷰에 넣으면 끝   

이제 테스트를 해보자  UIWebViewDelegate속성중    

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType  인스턴스메서드를 이용하면 되겠다. 


    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        if (navigationType == UIWebViewNavigationTypeLinkClicked)
        {
            NSURL *url = [request URL];
            NSString *stringurl = [url absoluteString];
            NSArray *arrItem = [stringurl componentsSeparatedByString:@"&+?"];
            if ([arrItem count] >= 2) {
                NSString *urlstring = [arrItem objectAtIndex:0];
                NSURL *url = [[NSURL alloc]initWithString:
                              [urlstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
                [[UIApplication sharedApplication] openURL:url];
                return false;
            }
            return true;
        }
        return true;
    }


webview를 터치시 동작 하는 메서드인데 해당 타입이 클릭일때 그 request url중에 위의 넣은 open_safari가 있는지 확인후 있을경우 동작을 취해 주면되겠다. 
 약간의꼼수를 이용한 방법이다.