【问题标题】:UIWebView detect when javascript is loading a new pageUIWebView 检测javascript何时加载新页面
【发布时间】:2012-02-22 22:03:12
【问题描述】:

我有一个 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 的 scheme 属性,看看它是否是“javascript”,但它看起来与常规链接使用的 URL 相同。

谁能想到一种方法来检测网页何时被 javascript 函数打开?

我想最坏的情况我可以使用布尔值来确定这是否是我的 UIWebView 第一次被加载并在新页面中加载所有后续链接,但必须有更好的解决方案

谢谢!

【问题讨论】:

    标签: javascript objective-c uiwebview


    【解决方案1】:

    是的:要捕获 Javascript 引起的页面加载,您应该检查 webView: shouldStartLoadWithRequest:navigationType: 中的 navigationType == UIWebViewNavigationTypeOther

    【讨论】:

    • 我试过了,但是当我第一次从字符串中加载视图时它就捕获了。也许我可以通过某种方式检测视图何时首次加载并重定向所有后续加载?
    • 当您将 HTML 字符串加载到 WebView 中时,webView:shouldStartLoadWithRequest:navigationType: 中的请求 URL 是 nil'about:blank' - 您应该能够捕获这些以区分初始加载和后续加载那些。
    【解决方案2】:

    UIWebViewNavigationTypeOther 中的navigationType 还将包括后台页面加载,例如分析,我认为您不想从外部加载。

    要仅检测页面导航,您需要将[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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2012-05-24
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多