1

当加载时获取文件扩展名时,浏览器会解释什么?

我尝试混合使用 html、svg 和 dtd(实体)。我尝试以一种有效的方式做到这一点。但现在代表一个我不明白的问题。我做了:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html [
            <!ENTITY duration "3s">
            ...
            ...
    <div style='width:100%; border:1px solid black;'>high there</div>
    <p>toaster</p>
    <hr/>
    <svg width="600" ... 

并且我的“页面”按预期显示,我的 Rubymine 没有任何注释“读取”文件。

只要文件扩展名是SVG(即 index.svg)。如果我将其更改为HTML - 运气不好。该页面看起来有点像它应该的。在此处查看两种变体:

作为 svghtml

当浏览器根据文件扩展名“改变主意”时,现在幕后会发生什么?

顺便说一句,我的 RumyMine 告诉我文件有问题,它有“html”扩展名(但不是什么)。

我更喜欢两者:告诉我会发生什么,并告诉我什么是做我想做的事情的正确方法。

4

1 回答 1

3

这与浏览器处理扩展无关,而是从服务器如何处理扩展开始。

事实上,规范说:

文件扩展名不用于确定通过 HTTP 检索的资源的提供的 MIME 类型,因为它们不可靠且容易被欺骗。

当页面作为http://keepitsimple-soft.com/question.html提供时,您的 Apache 服务器在响应中包含这个 HTTP 标头:Content-Type: text/html因此浏览器知道它是一个 HTML 页面并使用 HTML 解析器来读取它。HTML 解析器不处理 DOCTYPE 中的那些实体定义,因此它无法在 SVG 中正确解释它们。

当页面作为http://keepitsimple-soft.com/question.svg提供时,服务器会在响应中包含这个 HTTP 标头:Content-Type: image/svg+xml。在这种情况下,浏览器识别“+xml”部分并使用其 XML 解析器解析文件。这确实解释了实体定义,因此可以完全处理 SVG。

至于您应该做什么,您可以使用 XHTML 并坚持使用 XML 解析器,或者在通过网络发送页面之前解析实体定义,在这种情况下,您的页面应该使用 HTML 解析器。(虽然我没有测试过这个。)

于 2013-09-22T20:31:05.547 回答