2009-08-02 52 views
11

[webView:shouldStartLoadWithRequest:navigationType:]イベントでは、コンテンツを読み込んでいるiframeとコンテンツを読み込んでいるページ全体の違いをどのように確認できますか?どちらも、同じ引数を使って同じイベントを呼び出すようですが、唯一の違いはロードされるURLなので、2つの違いを区別する方法はありません。UIWebViewでiframe読み込みとページ読み込みの違いを確認するにはどうすればよいですか?

私も違いを見分けるためにいくつかの方法を考えてきました:

  • は、ページのソースコードを解析し、すべてのiframeのsrc属性のリストを格納し、URLのロードが1である場合と仮定私のリストにあるもののうち、それはiframeです。もちろん、実際にこのページに移動した場合、この仮定は間違っている可能性があります。
  • 上記と同じですが、ページ上でJavaScriptを実行し、iframeのsrc属性を取得します。 JavaScriptを使用して
  • は、JavaScriptを使用してhttp://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • に似たユーザーがページに移動しようとするたびのためのフックを、設定し、右の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としても表示されます。したがって、navigationType = 5では、ページ全体がJavaScriptを介してURLを変更したのか、それとも同じページにiframeを読み込んでいるのか分かりません。

私はこの方法を使用
+1

navigationType == 5.代わりに、コード内で、その名前で名前を参照する必要があります。 UIWebViewNavigationTypeその他。コンパイラはそれを普通の古い整数に煮詰めますか?はい。しかし、それを正しい方法で実行すると、列挙型の順序を変更したり、将来特定の整数を指定したりすることができます。 –

答えて

6

にYESを返すことによって、通常は、ページの読み込みをしてみましょう[WebViewの:shouldStartLoadWithRequest:navigationType:]のWebViewのURLが変更されたりされていない場合、イベント、およびそれが読み込み完了だ後は、参照...もしそうであれば、それはページリダイレクトだったことを意味します。そうでなければ、ロードされたiframeである可能性があります。

2

これを検出するために、HTTP「referer」(実際のヘッダーのスペルが間違っています)フィールドを正常に使用しました。これは、メインページのURL(webviewから入手可能)またはその他のもの(おそらくフレーム)でなければなりません。例えば ​​- FYI、あなたはそれらの整数値でアップル列挙型を参照することは避けるべきと同じように

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

これは最近はうまくいきません。リファラーヘッダはありません。私は得る: { を受け入れる= "text/html、アプリケーション/ xhtml + xml、アプリケーション/ xml; q = 0.9、*/*; q = 0.8"; AppleWebKit/536.26(GeckoのようなKHTML)Mobile/10B141 ";ユーザ名: " User-Agent "=" Mozilla/5.0(Mac OS XのようなiPhone; } – philoye

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

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

} 
+0

唯一の悪い回答 – Fattie

関連する問題