我有一个应用程序,可以为人们提供简单的html页面。其中一些人使用表格进行设计布局。 (不是我,我发誓!)出于一些神秘的原因,渲染在Internet Explorer中打破了这些布局。
这是我能够重现这个问题的最简单方法。
当我将html文件保存到public /并通过Mongrel访问它时,它在所有浏览器中都显示正常。如果我使用以下代码来呈现文件,它会变得很时髦:
render :file => '[app_directory]/public/sample.html'
Internet Explorer为每个换行创建一个空文本节点,这会导致表中出现空白。原始html显然是相同的,但是当使用渲染时,它会以某种方式改变,使Internet Explorer不满意。
对于如何阻止这一点,我会非常感激。谢谢!
我已经弄清楚如何让Chrome出现同样的错误。这是在Chrome中有效的代码,在IE中被破坏了:
# tab_controller.rb
render :inline => tab.public_html
但是当我将其更改为使用外部ERB模板时,奇怪的空白也出现在Chrome中:
# tab_controller.rb
@html = tab.public_html
render 'show'
# show.erb
<%=raw @html %>
我确信对此有一个解释,但我越挖掘它得到的陌生人。
以下是IE为静态服务文件提供的响应标头:
Response HTTP/1.1 200 OK
Connection close
Date Fri, 05 Aug 2011 00:33:20 GMT
Last-Modified Thu, 04 Aug 2011 23:38:21 GMT
Content-Type text/html
Content-Length 913
以下是IE为通过渲染生成的内容提供的响应标头。有问题的内容:
Response HTTP/1.1 200 OK
Connection close
Date Fri, 05 Aug 2011 00:28:18 GMT
Content-Type Text/html
X-UA-Compatible IE=Edge
ETag "43d392ddbbcf3856ced3de672005c26f"
Cache-Control max-age=0, private, must-revalidate
Set-Cookie _rails_static_html_session=[session stuff]; path=/; HttpOnly
X-Runtime 31.964569
Transfer-Encoding chunked
您可以(我希望)通过将以下代码放在任何随机控制器中来重现该问题:
html = "<html>\n<head>\n</head>\n\n<body>\n<table width='520' height='870' border='0' cellpadding='0' cellspacing='0'>\n <tr>\n <td align='center' valign='top'><div align='center'>\n <table width='520' border='0' cellspacing='0' cellpadding='0'>\n <tr>\n <td><img src='.' width='520' height='314' /></td>\n </tr>\n <tr>\n <td><img src='.' width='520' height='320' /></td>\n </tr>\n <tr>\n <td><img src='.' width='520' height='166' /></td>\n </tr>\n <tr>\n </tr>\n </table>\n </div></td>\n </tr>\n</table>\n</body>\n</html>"
render :inline => html
File.open('/railsappdirectory/public/sample_html.html', 'w') {|f| f.write(html) }
当您通过rails应用程序使用Internet Explorer访问此文件时,图像之间会有间隙。当您将html文件视为静态资产时,将没有间隙。
答案 0 :(得分:1)
我使用一个简单的php文件来提供不同标题的相同内容,并发现以下标题栏使用了导致问题:
X-UA-Compatible: IE=Edge
对this question的评论解释了如何阻止rails提供此标头。在config / environments / * .rb文件中,请确保以下设置为false:
config.action_dispatch.best_standards_support = false
感谢大家的帮助!