2009-08-02 8 views
11

[webView : shouldStartLoadWithRequest : navigationType :] 이벤트에서 콘텐츠를로드하는 iframe과 전체 페이지로드 콘텐츠의 차이점을 어떻게 알 수 있습니까? 같은 인수를 사용하여이 동일한 이벤트를 호출하는 것처럼 보입니다. 단 하나의 차이점은로드 될 URL이므로 다른 두 가지 차이점을 알 수있는 방법은 없습니다.UIWebView에서 iframe 로딩과 전체 페이지 로딩의 차이점을 확인하는 방법은 무엇입니까?

그래도 난 차이를 말할 수있는 몇 가지 방법을 생각했습니다

  • 페이지의 소스 코드를 구문 분석하고 모든 iframe이 SRC 속성의 목록을 저장, 가정의 URL 로딩 한 경우 그 내 목록에있는 사람들 중 iframe입니다. 물론이 가정은 실제로 페이지로 이동하는 경우 올바르지 않을 수 있습니다.
  • 위와 동일하지만 페이지에서 일부 JavaScript를 실행하고 iframe src 특성을 가져옵니다. 자바 스크립트를 사용
  • 는 자바 스크립트를 사용하여 http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • 유사한 사용자가 페이지로 이동하려고 할 때마다 후크를 설정, 바로 iframe을하기 전에 후크를 설정로드 데이터 (나는 같은 것을 할 것입니다 방법을 잘) 시도 .
  • 각 iframe의 src 속성이 해당 src 속성의 끝에 특수 문자열을 포함하도록 수정합니다. "# iframe-loading". 이 수정 된 소스 코드로 UIWebView를로드하십시오. 이 기능은 동적으로로드 된 페이지가 아니라 처음 페이지에서 처음 조회 된 iframe에만 작동합니다. JavaScript를 통해
  • [webView : shouldStartLoadWithRequest : navigationType :] 이벤트에서 YES을 반환하여 페이지가 정상적으로로드되도록하고 일단로드가 완료되면 WebView의 URL이 변경되었는지 확인합니다. 그렇지 않으면 페이지 리디렉션임을 의미합니다. 그렇지 않은 경우로드 된 iframe 일 가능성이 높습니다.
  • 자바 스크립트를 사용하면 실제로 창 위치를 변경하기 전에 window.location 속성 설정 도구를 재정 의하여 내 코드를 실행하십시오. 그러면 Objective-C와 통신하여 다음로드가 실제로 리디렉션이 될 것임을 알릴 수 있습니다. 이것이 JavaScript에서 리디렉션 할 수있는 유일한 방법입니까?

가장 적합한 방법은 무엇입니까? 내가 생각하지 못했던 어떤 생각을 할 수 있니? iframe에 JavaScript를 사용하여 조작 할 수있는 특별한 이벤트/속성이 있나요?

감사

업데이트 : 그것은 단지 navigationType을 확인하는 것만 큼 간단하지 않습니다. 새로운 페이지를 열려면 링크를 클릭해도 navigationType = 0으로 표시되지만 JavaScript 리디렉션 (window.location 변경)은 navigationType = 5로 표시됩니다. iframe로드도 navigationType = 5로 표시됩니다. 따라서 navigationType = 5, 전체 페이지가 JavaScript를 통해 URL을 변경했는지 아니면 동일한 페이지에로드하는 iframe인지 여부는 알 수 없습니다.

난 그냥이 방법을 사용
+1

그들의 정수 값으로 유형을 열거 navigationType == 5. 대신 코드에서 이름으로 이름을 참조해야합니다. UIWebViewNavigationType 기타. 컴파일러가 평범한 오래된 정수로 압축합니까? 예. 그러나 열거 형의 순서를 변경하거나 장래에 특정 정수를 지정하는 경우 올바른 방법을 사용하면 격리가 유지됩니다. –

답변

6

: [: shouldStartLoadWithRequest을 : 웹보기 navigationType :]

가에 YES를 반환하여 페이지로드는 일반적으로합시다 이벤트, 그리고 그것은로드가 완료 된 후에는, 웹보기의 URL이 변경되는지 여부를 ... 그렇게했다면 페이지 리다이렉트를 의미합니다. 그렇지 않다면로드 된 iframe을 의미 할 것입니다.

2

나는 이것을 감지하기 위해 HTTP "referer"(실제 헤더는 맞춤법 오류가 있음) 필드를 성공적으로 사용했습니다.이것은 메인 페이지의 URL (webview에서 사용 가능)이거나 다른 것 (아마도 프레임)이어야합니다. 예를 들어, - 당신이 애플 참조하지 않도록해야합니다 그냥 참고로 AS를

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"]; 
NSString *currentPage = [webView.request.mainDocumentURL absoluteString]; 
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO; 
+0

요즘에는 작동하지 않습니다. 리퍼러 헤더가 없습니다. 나는 얻는다 : { Accept = "text/html, application/xhtml + xml, application/xml; q = 0.9, */*; q = 0.8"; "User-Agent"= "Mozilla/5.0 (Mac OS X과 같은 iPhone 및 CPU iPhone OS 6_1) AppleWebKit/536.26 (Gecko와 같은 KHTML) Mobile/10B141"; } – philoye

35
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 

BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]]; 

} 
+0

유일한 불량 답변 – Fattie

관련 문제