UIWebViewでのiframeの読み込みとページ全体の読み込みの違いを知る方法は?

StackOverflow https://stackoverflow.com/questions/1218493

  •  10-07-2019
  •  | 
  •  

質問

[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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top