【问题标题】:Opening popup links in UIWebView, possible?在 UIWebView 中打开弹出链接,可能吗?
【发布时间】:2010-11-17 17:30:50
【问题描述】:

我有一个 UIWebView,在我的应用中用作嵌入式浏览器。

我注意到打开新窗口的网页中的链接会被忽略,而无需调用我的代码。

我试过断点

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

然后选择一个会打开一个弹出窗口的链接,并且断点永远不会被命中。 我能做些什么来拦截弹出链接的选择并获取 URL 并正常加载它吗?

我对在应用程序本身中显示弹出窗口不感兴趣,我只想将要在弹出窗口中加载的任何内容的 URL 加载到主 webview 本身中。

这可能吗?

谢谢!

【问题讨论】:

    标签: iphone objective-c uikit uiwebview popup


    【解决方案1】:
        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];
    

    【讨论】:

      【解决方案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】:

        我也遇到过这种情况,而 HTML 重写是我能想到的最佳解决方案。我在使用这种方法时遇到的最大问题是,在调用 webViewDidFinishLoad: 方法之前,Web 浏览器最多可以交互几秒钟,因此链接似乎会中断几秒钟,直到它们被重写。

        我重写了三个区域:链接、表单帖子和对 window.open() 的调用。

        我使用与Jasarian's 答案中的第一个代码类似的方法通过迭代标签和表单来覆盖链接和表单的目标。为了覆盖 window.open,我使用了类似于以下的代码:

        var oldWindowOpen = window.open;
        window.open = function(url, sName, sFeatures, bReplace) {
          oldWindowOpen(url, '_self');
        };
        

        【讨论】:

          【解决方案4】:

          因此,经过少量研究,很明显 UIWebView 类故意忽略将在新窗口中打开的链接(通过使用 a 标签上的“目标”元素或在 onClick 事件中使用 javascript)。

          我发现的唯一解决方案是使用 javascript 操作页面的 html。虽然这适用于某些情况,但它不是防弹的。以下是一些示例:

          links = document.getElementsByTagName('a');
          for (i=0; i<links.length; i++)
          {
              links[i].target='_self';
          }
          

          这会将所有使用 'target' 元素的链接更改为指向 _self - 而不是 _blank 或 _new。这可能会全面工作,不会出现任何问题。

          我发现的另一个 sn-p 遵循相同的想法,但使用了 onClick 事件:

          links = document.getElementsByTagName('a');
          for (i=0; i<links.length; i++)
          {
              links[i].onclick='';
          }
          

          这个简直太恶心了。仅当链接标记的 href 元素设置正确,并且仅当使用 onclick 事件打开新窗口(使用 window.open() 或类似的东西)时,它才会起作用。它令人讨厌的原因不需要解释,但一个例子是如果 onClick 用于打开窗口以外的任何事情 - 这是一种非常常见的情况。

          我想人们可以更进一步,开始使用 onClick 方法进行一些字符串匹配,并检查 window.open(),但同样,这真的很不理想。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            相关资源
            最近更新 更多