UIWebView определяет, когда JavaScript загружает новую страницу - PullRequest
1 голос
/ 23 февраля 2012

У меня есть UIWebView, и я хочу, чтобы ВСЕ ссылки открывались на новой странице.

У меня есть этот код для определения, когда пользователь щелкает ссылку и открывает эту ссылку на новой странице:

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


//If the user clicked a link don't load it in this webview
if (navigationType == UIWebViewNavigationTypeLinkClicked) {


        NSURL* URLToGoTo = [request URL];
        self.fullWebView.url = URLToGoTo;
        [self.navigationController pushViewController:fullWebView animated:YES];
        return NO;
}
//Else this is the webview being loaded for the first time, let it load.
return YES;

Проблема в том, что некоторые веб-сайты используют JavaScript для открытия ссылок, подобных этой:

win = window.open("/magic/card.asp?name="+cardname+"&set="+set+"&border="+border, windowName, params);

if (!win.opener) 
{
    win.opener = window;
}

К сожалению, ссылки этого типа не имеют свойства UIWebViewNavigationTypeLinkClicked и будут открываться в том же окне моего UIWebView.

Я попытался просмотреть свойство схемы URL-адреса, чтобы определить, является ли оно «javascript», но оно выглядит идентично URL-адресу, используемому обычными ссылками.

Может кто-нибудь придумать, как определить, когда веб-страница открывается функцией javascript?

Полагаю, в худшем случае я могу использовать логическое значение, чтобы определить, загружается ли мой UIWebView впервые и загружать все последующие ссылки на новую страницу, но должно быть лучшее решение

Спасибо!

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Да: чтобы отследить загрузку страниц, вызванную Javascript, вы должны проверить navigationType == UIWebViewNavigationTypeOther в webView: shouldStartLoadWithRequest:navigationType:.

1 голос
/ 29 июня 2016

A navigationType из UIWebViewNavigationTypeOther также будет включать фоновые загрузки страниц, такие как аналитика, которые, как я полагаю, вы не хотите загружать извне.

Чтобы обнаружить только навигацию по страницам, необходимо сравнить [request URL] с [request mainDocumentURL]:

- (BOOL)webView:(UIWebView *)view shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)type
{
    if ([[request URL] isEqual:[request mainDocumentURL]])
    {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    else
    {       
        return YES;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...