早上好,
我有一个mac webView(非iOS UIWebView)加载url指向http://localhost:8888
。加载的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似乎是hackish。
关于为什么webView以这种方式构建网址以及如何正确处理加载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]];
}
}
答案 0 :(得分:4)
请注意,您的网址包含转义序列%E2%80%9C
和%E2%80%9D
。这些是“
和”
的URI转义序列。这些看起来像"
,但是“打开”和“关闭”双引号的字符略有不同。当webView处理HTML并在href
之后查找属性值时,webView找不到包含属性值的双引号或单引号。它找到了另一个角色。由于引号不是预期的HTML属性引用字符,因此webView将其解释为URL的一部分。由于URL不是以已知协议(http://
,https://
等)或URL根(/
)开头,因此webView将URL解释为相对于您给定的网址(http://localhost:8888/
)。要使其成为有效的URL(特定的ASCII字符),它会转义两个非ASCII的富引号字符。这就是为什么它们会在您的网址中显示为%E2%80%9C
和%E2%80%9D
而不是“
和”
。更简洁:
href=“http://example.com”
与href="http://example.com"
“http://example.com”
,而不是http://example.com
http://localhost:8888/“http://example.com”
http://localhost:8888%E2%80%9Chttp://example.com%E2%80%9D
最有可能的是,有些人会从Word文档或其他富文本格式化程序中复制并粘贴HTML,这通常会将简单的双引号转换为“更丰富”的格式化双引号。用适当的双引号或单引号替换丰富的引号,您的链接将按预期开始工作。