Wie der Unterschied zwischen einem iframe Laden vs. gesamter Seite geladen in einem UIWebView erzählen?

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

  •  10-07-2019
  •  | 
  •  

Frage

In dem [WebView: should: navigationType:] Ereignis, wie kann man den Unterschied zwischen einem iframe sagen, dass Inhalte im Vergleich zu dem gesamten Laden der Seite Inhalt ist geladen? Es scheint, wie die beiden nennen das gleiche Ereignis mit den gleichen Argumenten, der einzige Unterschied ist die URL, die geladen werden wird, also gibt es keine Möglichkeit, den Unterschied zwischen den beiden zu sagen.

Ich habe gedacht, ein paar Möglichkeiten, wenn auch den Unterschied zu erkennen:

  • , um den Quellcode der Seite analysieren und speichern Sie eine Liste aller iframe src Attribute, gehen davon aus, dass, wenn die URL Laden einer von denen in meiner Liste ist es ein iframe. Natürlich könnte diese Annahme falsch, wenn es tatsächlich auf der Seite nicht navigieren.
  • Wie oben, aber einige JavaScript auf der Seite auszuführen und die iframe src Attribute zu erhalten.
  • Verwenden Sie JavaScript, um einrichten Haken für, wenn ein Benutzer versucht, auf eine Seite, ähnlich wie http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • Verwenden Sie JavaScript, um einrichten Haken rechts, bevor ein iframe Laden von Daten (nicht sicher, wie ich so etwas tun würde) versucht.
  • Ändern jeden src-Attribut des iframe eine spezielle Zeichenfolge am Ende davon enthalten ist Attribut src z.B. "# Iframe-Laden". Laden Sie die UIWebView mit diesem modifizierten Quellcode. Obwohl dies nur für Iframes arbeiten, die auf der Originalseite existiert, da es das erste Mal abgefragt wurde, nicht diejenigen, die dynamisch geladen werden, z.B. via JavaScript.
  • Lassen Sie die Seite zu laden, die normalerweise von YES in der Rückkehr [WebView: should: navigationType:] Ereignis, und sobald es das Laden fertig ist, ob die URL der WebView geändert oder nicht ... wenn es so wäre, dass bedeutet es eine Seite Umleitung war wenn es nicht wahrscheinlich bedeutet, es ist ein iframe, die geladen wurde.
  • Verwenden Sie JavaScript, überschreiben die window.location Eigenschaft Setter meinen eigenen Code auszuführen, bevor er die Position des Fensters verändern wird tatsächlich. Ich konnte dann mit Objective-C kommunizieren, um es wissen zu lassen, dass die nächste Last wird, um tatsächlich eine Umleitung sein. Ist dies der einzige Weg, in JavaScript umleiten obwohl?

Was ist der beste Weg, dies zu tun? Können Sie irgendwelche Möglichkeiten denken ich nicht gedacht haben? Iframes hat ein besonderes Ereignis / Objekt kann ich mit JavaScript manipulieren könnte, mir zu helfen?

Danke

Aktualisieren : Es ist nicht so einfach wie nur die navigationType überprüfen. Obwohl ein Link auch eine neue Seite zu öffnen, wird sich zeigen, wie navigationType = 0, ein JavaScript-Weiterleitung (Ändern window.location) wird zeigen, wie navigationType = 5. Ein iframe Last zeigt sich als navigationType = 5. Also, wenn navigationType = 5, Sie wissen nicht, ob die gesamte Seite URLs via JavaScript geändert oder wenn es einfach ein iframe Laden auf der gleichen Seite.

War es hilfreich?

Lösung 2

ich diese Methode nur verwendet:

  

Lassen Sie die Seite zu laden, die normalerweise von JA Rückkehr in den [WebView: should: navigationType:] Ereignis, und sobald es das Laden fertig ist, ob die URL der WebView geändert oder nicht ... wenn es so wäre, dass bedeutet es eine Seite Umleitung war wenn nicht wahrscheinlich bedeutet es, es war ein iframe, die geladen wurde.

Andere Tipps

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

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

}

Ich habe erfolgreich die HTTP „Referer“ (die eigentlichen Header falsch geschrieben) Feld, dies zu erkennen. Dies sollte entweder die URL der Hauptseite (erhältlich von der Webansicht) oder etwas anderes -. Wahrscheinlich einen Rahmen

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top