惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
罗磊的独立博客
爱范儿
爱范儿
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
G
GRAHAM CLULEY
A
About on SuperTechFans
C
Cisco Blogs
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
Project Zero
Project Zero
V
V2EX
K
Kaspersky official blog
P
Privacy International News Feed
博客园 - 叶小钗
I
Intezer
T
Threatpost
The GitHub Blog
The GitHub Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V
Vulnerabilities – Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 【当耐特】
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
The Cloudflare Blog
P
Palo Alto Networks Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Tenable Blog

博客园 - 夏狼哉

.Net framework 的浏览器定义文件 Windows按名称排序问题 SilverLight与WCF服务双工通讯第二篇:Net.Tcp binding SilverLight与WCF服务双工通讯第一篇:PollingDuplexHttpBinding SilverLight通过Net.TCP(NetTCPBinding)方式调用WCF服务 WCF与Asp.Net Web Application的深度整合方法 C#与Outlook交互收发邮件 分布式版本控制系统Mercurial(二):web server的架设 分布式版本控制系统Mercurial(一):Mercurial基本功能介绍 C#将汉字转换为拼音首字母 nbsp空格 VS2010 targetFramework 错误 在网络上共享条码打印机 WCF身份验证之二:使用MessageHeader进行验证 WCF身份验证之一:使用证书进行验证 Windows CE 5.0 Emulator [条码打印]使用斑马语言(ZPL)打印汉字 C#打印条码与ZPL 应用程序在网络上通信的实现(C#)
IE的文档模式, 及Textarea呈现bug一例
夏狼哉 · 2013-08-14 · via 博客园 - 夏狼哉

做了个非常简单的页面, 仅有几行html代码, 内容如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <table>
        <tr>
            <td style="width:800px;height:300px;border:1px solid red;">
                <textarea style="width:100%;height:100%"></textarea>
            </td>
        </tr>
    </table>
</body>
</html>

在本地测试的时候是完全正常的, 界面如下图:

image

但是发布到服务器上以后再访问, 呈现的界面却变成了这样:

image

即,中间的TextArea高度不对, 100%的设定不起作用了.

进一步的, 我继续在本地试验, 原先我用的地址是localhost, 把localhost改成我的机器名, 果然, 现象跟服务器一模一样, textarea的高度出问题了.

ps: 我用的浏览器是IE10.

我又在另一台电脑(IE6) 上访问这个页面, 结果也是如图2那样, 没有正确呈现高度.  

如果换用chrome, 则在所有情况下都能正确按100%呈现高度.

研究了一下这个问题, 发现原来IE对localhost是做了特殊处理的, localhost和其它域名所采用的默认文档模式是不同的.

文档模式

在IE上按F12, 打开开发工具窗口( 应该IE7以上都有这个功能) , 最右侧即显示文档模式:

image

IE10支持如上图所示的6种文档模式, 可以通过鼠标点击, 或快捷键来切换文档模式, 切换以后, 页面的呈现即立即改变.

其中, Standards模式是”最新的”,即, 尽量按照w3c的标准来呈现, 这个结果一般与chrome等浏览器一致.

而Quirks模式是来自IE5以及更早版本的IE. 是一种向下兼容模式.

除了这两种典型模式以外, 还同时支持IE7,8,9 三种不同的标准, 以及IE5 quirks .

IE选择文档模式的标准是取决于文档顶部的<!DOCTYPE>, 当文档没有doctype声明时, IE认为这是很早之前的老页面, 将以quirks模式呈现. 当有doctype时, 则按照doctype的不同自动选择. 

中, 上述代码中<!DOCTYPE html> 标记表明这是html5页面.

本来, IE发现这是html5页面, 应该采用standards模式呈现, 为什么在实践中却自动选择了IE7 standards? 我找了一下, 在Tools->Compatibility View Settings窗口中, 默认勾选了Display intranet sites in compatibility view选项:

image

意思是对局域网的所有网页开启兼容模式, 这导致IE10 对html5页面选择了IE7 标准, 而localhost则不同, 它被做了特殊处理, 不以兼容模式呈现. 取消此项, 再用机器名测试一下, 果然正常呈现了, 检查文档模式, 确实是Standards模式. 完全符合预期.

此外, 可以通过兼容性元数据来告诉IE 某个页面要用哪个模式去呈现:

<meta http-equiv="X-UA-Compatible" content="IE=9" />

在页面的head中增加上述元数据后, 重新用IE访问该页面, 可以发现IE使用了IE9 standards模式.

把上述代码中的IE=9换成IE=7或IE=8 或IE=10,  则可以分别让IE用IE7 standards, IE 8 standards, 以及Standards( IE10 标准) 模式呈现.  (即使启用了上节的局域网兼容选项, 也仍然如此) 

除了具体指定IE的版本, 一般来说, 更好的选择是使用"IE=edge" , 该指令要求IE使用最新的版本解析(而不必在IE升级的时候去改代码). 

文档模式也可以在JS中通过document.documentMode属性读出.

因此, 为了让页面能够符合预期地呈现, 应该在html代码中增加上述指令, 明确地告诉IE选择哪个文档模式, 避免不同的客户端出现不同的呈现结果.

Textarea呈现BUG

还回到本文开头所提及的textarea呈现bug. 

测试表明, 该bug仅在IE6下, 以及IE7 standards模式下出现,  在Quriks模式下正常.

因此, 对于IE7以上版本的浏览器, 只要增加X-UA-Compatible元数据即可.

而对于IE6以及IE7, 就没有什么好办法了, 只能取消100%这个设定, 采用绝对像素法设定它的高度.

关于Textarea:

在aspx页面中, 当<asp:TextBox /> 的TextMode为MultiLine时, 将在客户端呈现为Textarea,

因此在aspx文件中也可以很容易地复制上述问题, 如下一行代码即可:

<asp:TextBox ID="txt1" runat="server" TextMode="MultiLine" Width="100%" Height="100%" />