我有一个UIWebView,我在我的应用程序中用作嵌入式浏览器。
我注意到,打开新窗口的网页中的链接会被忽略,而不会调用我的代码。
我试过了
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
然后选择一个可以打开弹出窗口的链接,并且永远不会遇到断点。 有什么办法可以拦截弹出链接的选择并获取URL并正常加载吗?
我对在应用程序本身中显示一个弹出窗口不感兴趣,我只想在弹出窗口中加载的任何内容的URL加载到主webview本身。
这可能吗?
谢谢!
答案 0 :(得分:7)
我也遇到过这种情况,HTML重写是我能想到的最好的解决方案。我遇到的最大问题是,在调用webViewDidFinishLoad:方法之前,Web浏览器是交互式的,最长可达几秒钟,因此链接似乎会被破坏几秒钟,直到它们被重写为止。 / p>
我重写了三个方面:链接,表单帖子和对window.open()的调用。
我在Jasarian's回答中使用了类似的方法来截断第一个代码,通过遍历标记和表单来覆盖链接和表单的目标。要覆盖window.open,我使用了类似于以下内容的代码:
var oldWindowOpen = window.open;
window.open = function(url, sName, sFeatures, bReplace) {
oldWindowOpen(url, '_self');
};
答案 1 :(得分:3)
因此经过少量研究后,很明显UIWebView类有目的地忽略了将在新窗口中打开的链接(通过使用标签上的'target'元素或在onClick事件中使用javascript)。 / p>
我找到的唯一解决方案是使用javascript操纵页面的html。虽然这适用于某些情况,但它不是防弹的。以下是一些例子:
links = document.getElementsByTagName('a');
for (i=0; i<links.length; i++)
{
links[i].target='_self';
}
这将更改使用'target'元素指向_self的所有链接 - 而不是_blank或_new。这可能会全面发挥作用而不存在任何问题。
我发现的另一个片段遵循相同的想法,但使用onClick事件:
links = document.getElementsByTagName('a');
for (i=0; i<links.length; i++)
{
links[i].onclick='';
}
这个只是简单的讨厌。它仅在链接标记正确设置了href元素时才有效,并且仅当onclick事件用于打开新窗口时(使用window.open()或类似的东西)。它令人讨厌的原因不应该解释,但是一个例子是如果onClick用于打开一个窗口以外的任何东西 - 这是一个非常常见的情况。
我想有人可以更进一步,并开始与onClick方法进行一些字符串匹配,并检查window.open(),但同样,这真的很不理想。
答案 2 :(得分:2)
以下是我如何使Twitter链接工作(即链接到尝试使用新窗口打开的页面):
-(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;
}
答案 3 :(得分:0)
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];