DOCTYPE的选择是否会影响javascript代码所见的DOM?
-
05-07-2019 - |
题
鉴于使用ASP.NET,javascript,css等技术的大型遗留项目,我想知道是否将网页的DOCTYPE从HTML 4.0 Transitional更改为XHTML 1.0 Transitional(或其他方式)以任何方式都可能破坏网页的javascript功能。
关于不同的DOCTYPES如何影响(css)页面呈现,有很多文章和讨论,但我似乎无法找到任何类似的破坏任何代码的主题。
我正在寻找有关一般需要注意的事项的文章的链接,以便更好地发现现有代码中的潜在问题,并避免在编写新代码时出现问题。
解决方案
更改DOCTYPE是否会破坏任何javascript函数实际上取决于这些函数的设计防御程度:)
例如,当文档以怪癖模式呈现时, document.body
(BODY)成为所谓的“根元素”;在标准模式下呈现时,该根元素通常是 document.documentElement
(HTML)。这是一个相当实质性的区别。如果确定浏览器屏幕大小的脚本始终从 document.documentElement
查询 clientWidth
/ clientHeight
属性,则显然会在quirks模式下报告错误的结果(因为,IIRC, document.documentElement.clientWidth / clientHeight
将表示HTML元素的维度,而不是屏幕的维度)。
大多数JS库通常都明确说明是否支持quirksmode(我们 - Prototype.js - 例如,不支持quirks模式)。
说到 HTML vs XHTML ,为了让浏览器将文档呈现为XHTML,您首先必须使用适当的“内容类型”来提供文档。标题(即application / xhtml + xml)。如果您只将doctype更改为XHTML,但仍然将文档作为“text / html”提供,我知道的大多数浏览器仍会将其解析(并呈现)为HTML文档。
请注意,到目前为止,IE并不理解“真实”的XHTML内容,这就是为文档/ html(使用HTML4.01 doctype)提供文档的原因是推荐的方法(当然,除非IE不在支持的浏览器中)。
就“真实”中的DOM特性而言XHTML文档,我听说像 document.write
“这样的东西”不起作用“并且应始终通过 getAttribute / setAttribute
(而不是通过更简单的属性访问器)来执行访问节点属性。 IIRC, innerHTML
也存在一些问题。
在“真实”中缺乏关于DOM的信息。 XHTML文档可能是由于它在一般网络的文档/应用程序中不切实际(即IE缺乏对它的支持)。
其他提示
如果您正在使用DTD:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
那么你的网站在现代浏览器中的IE和几乎标准模式下处于怪异模式,并且因为xhtml 1.0过渡dtd强制页面处于标准模式,所以Javascript中会出现布局问题和潜在问题(特别是IE)因为在怪癖与标准之间渲染DOM之间存在一些显着差异。
但是,如果HTML 4.01 DTD包含系统标识符:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
它应该已经处于标准模式。您可以通过在您的站点中查询'document.compatMode'进行验证,如果它在标准中则会显示'CSS1Compat',否则如果处于怪癖模式则会显示'BackCompat'。
我假设您将使用XHTML 1.0 Transitional提供内容类型的text / html。