【问题标题】:Why does the url in the request of a decidePolicyForNavigationAction return http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D为什么decisionPolicyForNavigationAction的请求中的url返回http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D
【发布时间】:2014-07-24 15:05:13
【问题描述】:

早上好,

我有一个加载指向http://localhost:8888 的 url 的 mac webView(不是 iOS UIWebView)。加载的 html 包含链接和 iframe,但是当加载 iframe 或单击链接时,主页会尝试加载 http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D,然后重新加载原始页面 http://localhost:8888.。更奇怪的是,打开的链接或 iframe 确实会尝试加载 http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D

我尝试使用 decisionPolicyForNavigationAction 处理此问题,但 [request URL] 值以这种方式到达并解析它以提取嵌入的 url 似乎有点骇人听闻。

关于为什么 webView 以这种方式构建 url 以及如何正确处理加载 iframe 和链接的任何想法?

- (void)webView:(WebView *)webView
decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request
          frame:(WebFrame *)frame
decisionListener:(id <WebPolicyDecisionListener>)listener
{
    NSLog(@"Navigating to %@", [request URL]); // returns http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D
    [listener use];
}

- (void)webView:(WebView *)webView
decidePolicyForNewWindowAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request
   newFrameName:(NSString *)frameName
decisionListener:(id < WebPolicyDecisionListener >)listener {
    if ([actionInformation objectForKey:WebActionElementKey]) {
        // Happens here also :(
        NSLog(@"Opening in browser %@", [request URL]);
        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
    }
}

【问题讨论】:

  • 如果没有 HTML 本身就很难判断,我猜这是导致此问题的原因。 HTML 上的 iframe 是如何设置的,该 iframe 中的链接是如何设置的?
  • 当 WebView 上的标准链接时会发生这种情况,例如。 &lt;a href="http://www.google.com"&gt;google&lt;/a&gt; 被单击或当 js 插入 html 以创建 iframe 时,例如。 &lt;iframe src="http://www.google.com"&gt;&lt;/iframe&gt; 进入 WebView :S

标签: macos cocoa iframe webview


【解决方案1】:

请注意,您的 URL 包含转义序列 %E2%80%9C%E2%80%9D 包装它们。这些分别是 的URI 转义序列。这些看起来像",但对于“打开”和“关闭”双引号的字符略有不同。当 webView 处理 HTML 并在 href 之后查找属性值时,webView 没有按预期找到包裹属性值的双引号或单引号。它会找到另一个字符。由于引号不是预期的 HTML 属性引用字符,因此 webView 将其解释为 URL 的一部分。由于 URL 不是以已知协议(http://https:// 等)或 URL 根(/)开头,webView 将 URL 解释为相对于给定 URL(http://localhost:8888/) .为了使其成为有效的 URL(特定的 ASCII 字符),它转义了两个非 ASCII 富引号字符。这就是为什么它们在您的 URL 中显示为 %E2%80%9C%E2%80%9D 而不是 。更简洁:

  • href=“http://example.com”href="http://example.com" 不一样
  • 拉取的 URL 是 “http://example.com”,而不是 http://example.com
  • URL 是相对的,所以它变成了http://localhost:8888/“http://example.com”
  • URL 必须是 ASCII 安全的,因此非 ASCII 字符会被编码,从而产生http://localhost:8888%E2%80%9Chttp://example.com%E2%80%9D

最有可能的是,有人从 Word 文档或其他富文本格式化程序之类的东西中复制并粘贴 HTML,这通常会将简单的双引号转换为“更丰富”的格式化双引号。用适当的双引号或单引号替换丰富的引号,您的链接将按预期开始工作。

【讨论】:

  • 这确实是对症状的完美描述。尽管本身不是解决方案,但它确实为我指明了原因的正确方向。 js 代码有一个错误,其中每个组件都被初始化了两次。当js注入链接时,href在注入webview之前被过滤。双重过滤导致最终的 href 和 src 生成时带有编码的引号。将此标记为正确答案,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2021-09-25
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多