J'ai un uiwebview que j'utilise comme navigateur intégré au sein de mon application.
J'ai remarqué que des liens dans les pages Web qui ouvrent de nouvelles fenêtres sont ignorés sans appel dans mon code. P>
J'ai essayé d'éclairer sur p> puis en sélectionnant un lien qui ouvrirait une fenêtre contextuelle et que le point d'arrêt n'est jamais touché.
Y a-t-il quelque chose que je puisse faire pour intercepter cette sélection du lien contextu et obtenir l'URL et simplement le charger normalement? P> Je ne suis pas intéressé à afficher une fenêtre contextuelle dans l'application elle-même, je veux juste que le URL de tout ce qui va être chargé dans la fenêtre contextuelle pour charger dans la vision principale de la webview elle-même. P> est-ce possible? P> Merci! P> P>
4 Réponses :
Ainsi, après une petite quantité de recherche, il est clair que la classe UIWebView ignore délibérément que les liens qui s'ouvriront dans une nouvelle fenêtre (soit à l'aide de l'élément "cible" sur la balise A ou à l'aide de JavaScript dans l'événement OnClick). Les seules solutions que j'ai trouvées sont de manipuler le code HTML d'une page en utilisant JavaScript. Bien que cela fonctionne pour certains cas, ce n'est pas une pare-balles. Voici quelques exemples: p> Ceci changera tous les liaisons qui utilisent l'élément "cible" pour pointer sur _self - au lieu de _blank ou _new. Cela fonctionnera probablement dans l'ensemble du conseil et ne présente aucun problème. P> L'autre extrait que j'ai trouvé a suivi la même idée, mais avec l'événement OnClick: P> links = document.getElementsByTagName('a');
for (i=0; i<links.length; i++)
{
links[i].onclick='';
}
J'ai également couru dans cela, et la réécriture HTML était la meilleure solution que je puisse trouver. La principale question que j'ai rencontrée avec cette approche est que le navigateur Web est interactif pendant quelques secondes jusqu'à quelques secondes jusqu'à la chargement de WebViewDidfinishload: la méthode est appelée, de sorte que les liens semblent être cassés pendant quelques secondes jusqu'à ce qu'ils soient réécrites. < P> Il y a trois domaines que j'ai réécrit: liens, postes de formulaire et appels vers Window.Open (). P>
J'ai utilisé une approche similaire du premier code coupé dans Jasarian's Répondre pour écraser la cible des liens et formes en itérant sur des balises et des formes. Pour remplacer la fenêtre.Open, j'ai utilisé le code similaire à celui suivant: p>
Voici comment je reçois des liens Twitter pour travailler (c'est-à-dire un lien vers des pages qui tentent d'ouvrir avec de nouvelles fenêtres):
-(BOOL)webView:(UIWebView *)mainWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { //Allows for twitter links [self.mainWebView loadRequest:request]; return NO; } return YES; }
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; theConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = YES; webView1 = [[WKWebView alloc] initWithFrame:self.webView.frame configuration:theConfiguration]; webView1.navigationDelegate = self; webView1.UIDelegate = self; [self.view addSubview:webView1]; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { NSString *htmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"htmlString: %@", htmlString); [webView1 loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"your url"]; }]; [dataTask resume];