【问题标题】:chrome renders js different depending on the extension of the file to render [testcase included]chrome根据要渲染的文件的扩展名渲染js不同[包含测试用例]
【发布时间】:2010-06-08 15:23:03
【问题描述】:

我正在尝试实现我发现的图像平移器here Chrome 会根据所请求文件的扩展名以不同的方式呈现相同的文档。我创建了一个测试用例,当文件 not 命名为 test.xhtml

时它可以工作

您可以从here下载测试用例

有人知道为什么或如何解决它吗?我希望我的文件是 .xhtml 在 IE 和 FF 中运行良好。

代码: test.html / test.xhtml(更改名称以查看适用于其中一个但不适用于另一个)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<style type="text/css">
/*Default CSS for pan containers*/
.pancontainer {
    position: relative; /*keep this intact*/
    overflow: hidden; /*keep this intact*/
    width: 300px;
    height: 300px;
    border: 1px solid black;
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="http://www.dynamicdrive.com/dynamicindex4/imagepanner.js"></script>
</head>
<body>
<div class="pancontainer" data-orient="center" data-canzoom="yes" style="width: 350px; height: 200px; float: left; position: relative; overflow-x: hidden; overflow-y: hidden; cursor: move; "><img src="./test_files/image.jpg" style="position: absolute; width: 700px; height: 525px; left: -175px; top: -163px; display: block;" />
</div>
</body>
</html>

更新: 显然,多亏了 cmets,tomcat 将 application/xhtml+xml 作为 Content-Type 发送。

HTTP_TRANSACTION_READ_RESPONSE_HEADERS  
--> HTTP/1.1 200 OK            
Server: Apache-Coyote/1.1  
X-Powered-By: JSF/1.2      
Pragma: no-cache           
Cache-Control: no-cache    
Cache-Control: no-store    
Cache-Control: must-revalidate
Expires: Mon, 8 Aug 2006 10:00:00 GMT
Content-Type: application/xhtml+xml;charset=UTF-8
Transfer-Encoding: chunked 
Date: Wed, 09 Jun 2010 07:39:30 GMT

我在web.xml 中添加了一个 mime 类型:

<mime-mapping>
<extension>xhtml</extension>
<mime-type>text/html</mime-type>
</mime-mapping> 

但还是不行。我相信FacesServlet 正在读取文件扩展名并发送内容类型,覆盖web.xml 中的配置

 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.xhtml</url-pattern>
 </servlet-mapping>

我尝试修改 web.xml 配置以将 .xhtml 更改为 .html,但 Faces Servlet 将文件作为 application/xhtml+xml 提供,我想我可以向 webapp 添加一个过滤器,将 Content-Type 修改为text/html 但这有点 hacky。

为什么带有 Facelets 的 JSF 不将文件作为 html 提供?或者怎么做?

更新 找到了如何从 JSF 提供文本/html。你需要添加

<f:view contentType="text/html"/>

&lt;html&gt; 之后和&lt;head&gt; 之前

现在它在 chrome 中可以正常工作了。

【问题讨论】:

  • 使用带有 text/html 的 XHTML doctype 没有积极的影响,它只会强制浏览器进入 quirks 模式。要提供 XHTML 并将其解析为 XML,您必须将其作为 'application/xhtml+xml' 提供。为什么不使用 HTML5 文档类型?它更宽松,并且向后和向前兼容..
  • 顺便说一句,您是在本地打开它还是通过网络服务器打开它?如果在本地,Chrome 可能会尝试根据扩展名猜测内容类型。
  • @Sean 无论是在本地还是通过网络服务器(Tomcat)都存在同样的问题。
  • @pakore:你检查过 tomcat 使用的 mime 类型吗?您确定它确实知道发送 .xhtml 文件的正确 mime 类型吗?
  • @Sean_Kinsey 你是对的,tomcat 发送的是 application/xhtml+xm 而不是 text/html。查看我的更新。

标签: xhtml jsf google-chrome content-type facelets


【解决方案1】:

我不确定,但我知道的是,当您在 Chrome 中的本地文件上使用 .xhtml 扩展名时,该文件将使用 XML 解析器进行解析,如果您在本地文件,然后使用 HTML 解析器对其进行解析。

这很容易证明。在每个文件的底部添加&lt;span&gt;,使其不是XML 格式并尝试打开它。您将收到一条大警告消息,指出它只能处理 .xhtml 文件的错误,但会在 .html 文件中被忽略。

(顺便说一句,DOCTYPE 对此没有任何影响。)

这就是为什么当 XML 解析不太清楚时它不起作用的原因,但这可能是因为 jQuery 在某些情况下使用了 innerHTML 属性,它不应该与 XML 解析的 DOM 一起使用。

【讨论】:

  • 你是对的,我做了“跨度”的事情,它没有正确渲染。看我的更新。谢谢。
  • 感谢您的提示,我终于找到了答案。我设法正确配置了页面的内容类型。虽然拉撒路也是对的,但你的业力少,所以我接受你的问题来传播业力财富:P。
【解决方案2】:

DOCTYPE 表示使用哪种标准,DOCTYPE 为 XHTML 的 .html 文件将作为 XHTML 处理。不知道为什么 Chrome 对扩展名 .xhtml 的行为有所不同,它可能会强制使用某种默认的 DOCTYPE 并忽略包含的 DOCTYPE。 XHTML 现在已经被 HTML 5 抛弃了,尽管 XHTML 将在 HTML 5 浏览器中呈现,但不确定您当前的路线是否是您想要遵循的路线。

【讨论】:

  • 这是我用 jsf 做的事情的测试用例。 AFAIK jsf 尚未呈现 html5。再说html5还没完吧?不过感谢您的回答,我不知道为什么 chrome 会忽略 content-type 标签。
  • 正如@Sean_Kinsey 提到的,HTML5 文档类型是向前和向后兼容的(即你不会通过指定它来破坏任何东西)。您想使用 XHTML 的具体内容是什么?
  • 拉撒路,我终于修好了。感谢您的提示。如果我也可以将您的问题标记为有效,我会这样做!
  • 您声称“XHTML 现在已被放弃而支持 HTML 5”是不正确的。它远没有被抛弃,它是 HTML 5 的标准部分。参见 W3C 标准§§HTML vs XML SyntaxThe XML syntax
  • @MichaelAllan 你是对的,W3C 并没有正式放弃它,但根据我的经验,重点是 HTML 语法而不是 XHTML 变体。
猜你喜欢
  • 2014-05-23
  • 2021-03-19
  • 2011-10-31
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多