Comment faire la différence entre le chargement d'un iframe et le chargement d'une page entière dans un UIWebView?

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

  •  10-07-2019
  •  | 
  •  

Question

Dans l'événement [webView: shouldStartLoadWithRequest: navigationType:], comment savoir la différence entre un iframe chargeant du contenu et le contenu de la page entière? Il semble que les deux appellent le même événement avec les mêmes arguments, la seule différence étant l'adresse URL à charger, il n'y a donc aucun moyen de faire la différence entre les deux.

J'ai pensé à quelques façons de faire la différence:

  • Analyser le code source de la page et stocker une liste de tous les attributs iframe src, supposons que si le chargement de l'URL est l'un de ceux de ma liste, il s'agit d'un iframe. Bien sûr, cette hypothèse peut être incorrecte si elle accède à la page.
  • Comme ci-dessus, mais exécutez du code JavaScript sur la page et obtenez les attributs iframe src.
  • À l'aide de JavaScript, configurez des points d'ancrage chaque fois qu'un utilisateur tente d'accéder à une page, comme http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • À l'aide de JavaScript, configurez les points d'ancrage juste avant qu'une iframe ne tente de charger des données (je ne sais pas comment je ferais quelque chose comme ça).
  • Modifiez l'attribut src de chaque iframe pour inclure une chaîne spéciale à la fin de son attribut src, par exemple. "# iframe-loading". Chargez UIWebView avec ce code source modifié. Bien que cela ne fonctionne que pour les iframes qui existaient sur la page d’origine lorsqu’elle a été interrogée lors de la première interrogation, pas ceux chargés dynamiquement, par ex. via JavaScript.
  • Laissez la page se charger normalement en renvoyant YES dans l'événement [webView: shouldStartLoadWithRequest: navigationType:], et une fois le chargement terminé, voyez si l'URL de la vue Web a changé ou non ... s'il l'a fait cela signifie que c'était une page de redirection sinon, cela signifie probablement que c'était un iframe chargé.
  • À l'aide de JavaScript, remplacez le configurateur de la propriété window.location afin d'exécuter mon propre code avant qu'il ne modifie réellement l'emplacement de la fenêtre. Je pourrais ensuite communiquer avec Objective-C pour lui faire savoir que le prochain chargement sera en réalité une redirection. Est-ce la seule façon de rediriger en JavaScript?

Quelle est la meilleure façon de faire cela? Pouvez-vous penser à des moyens auxquels je n'ai pas pensé? Les iframes ont-ils un événement / une propriété que je peux manipuler avec JavaScript pour m'aider?

Merci

Mettre à jour : il ne suffit pas de vérifier le type de navigation. Bien que cliquer sur un lien pour ouvrir une nouvelle page s'affichera sous la forme navigationType = 0, une redirection JavaScript (changer de window.location) s'affichera sous la forme navigationType = 5. Un chargement iframe s'affichera également sous la forme navigationType = 5. Alors, lorsque navigationType = 5, vous ne savez pas si toute la page a changé d'URL via JavaScript ou s'il s'agit simplement d'un iframe se chargeant sur la même page.

Était-ce utile?

La solution 2

Je viens d'utiliser cette méthode:

  

Laissez la page se charger normalement en renvoyant YES à l'événement [webView: shouldStartLoadWithRequest: navigationType:], et une fois le chargement terminé, voyez si l'URL de la vue Web a été modifiée ou non ... si tel était le cas, il s'agissait d'une redirection de page sinon, cela signifie probablement que c'était un iframe chargé.

Autres conseils

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

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

}

J'ai utilisé avec succès le " référent & HTTP; HTTP (l’en-tête est mal orthographié) pour le détecter. Il doit s'agir de l'URL de la page principale (disponible dans la vue Web) ou de quelque chose d'autre, probablement un cadre.

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top