UIWebViewでのiframeの読み込みとページ全体の読み込みの違いを知る方法は?
質問
[webView:shouldStartLoadWithRequest:navigationType:]イベントで、コンテンツを読み込んでいるiframeとコンテンツを読み込んでいるページ全体の違いをどのように確認できますか?両方が同じ引数でこの同じイベントを呼び出しているようで、唯一の違いはロードされるURLであるため、2つの違いを区別する方法はありません。
しかし、違いを伝える方法をいくつか考えました:
- ページのソースコードを解析し、すべてのiframe src属性のリストを保存します。URLの読み込みがリスト内のいずれかである場合、それはiframeであると想定します。もちろん、実際にページにナビゲートする場合、この仮定は正しくない可能性があります。
- 上記と同じですが、ページでJavaScriptを実行し、iframe src属性を取得します。
- JavaScriptを使用して、 http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
- JavaScriptを使用して、iframeがデータのロードを試みる直前にフックを設定します(このようなことをどのように行うかはわかりません)。
- 各iframeのsrc属性を変更して、src属性の最後に特別な文字列を含めます。 "#iframe-loading"。この変更されたソースコードでUIWebViewをロードします。これは、最初にクエリが実行されたときに元のページに存在していたiframeでのみ機能しますが、動的に読み込まれるiframeなどでは機能しません。 JavaScript経由。
- [webView:shouldStartLoadWithRequest:navigationType:]イベントで
YES
を返すことでページを通常どおりロードし、ロードが完了したら、WebViewのURLが変更されたかどうかを確認します。つまり、ロードされたiframeであった可能性が高い場合を除き、ページリダイレクトであったことを意味します。 - JavaScriptを使用して、実際にウィンドウの場所を変更する前に、window.locationプロパティセッターをオーバーライドして独自のコードを実行します。次に、Objective-Cと通信して、次のロードが実際にリダイレクトになることを通知できます。これがJavaScriptでリダイレクトする唯一の方法ですか?
これを行う最良の方法は何ですか?私が考えていない方法を考えていただけますか? iframeにはJavaScriptで操作できる特別なイベント/プロパティがありますか?
ありがとう
更新:navigationTypeを確認するだけでは簡単ではありません。リンクをクリックして新しいページを開くと、navigationType = 0として表示されますが、JavaScriptリダイレクト(window.locationを変更する)はnavigationType = 5として表示されます。iframeロードもnavigationType = 5として表示されます。 5、ページ全体がJavaScriptを介してURLを変更したのか、それとも同じページにロードされたiframeだけなのかわかりません。
解決 2
この方法を使用しました:
[webView:shouldStartLoadWithRequest:navigationType:]イベントでYESを返すことでページを通常どおりロードし、ロードが完了したら、WebViewのURLが変更されたかどうかを確認します。そうでない場合は、おそらくロードされたiframeであることを意味します。
他のヒント
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]];
}
HTTPの「リファラー」を正常に使用しました。 (実際のヘッダーのスペルが間違っています)これを検出するフィールド。これは、メインページ(Webビューから利用可能)のURLか、他の何か-フレームである可能性があります。
NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;