JavaScript中的document.compatMode


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/09/16/JavaScript%E4%B8%AD%E7%9A%84document-compatMode/

摘要

本文主要讲述了:

  1. 背景
  2. 怪异模式
  3. 标准模式
  4. 选择机制
  5. 作用

正文

背景

由于历史原因,在 W3C 制订网页标准之前,曾存在两种事实标准:

  • 适用于网景浏览器的网页标准
  • 适用于 IE 浏览器的网页标准

为此,浏览器厂商共引入了三种渲染模式来保证兼容性:

  • quirks mode 怪异模式
  • almost standards mode 准标准模式,也被称作”limited quirks mode”(有限怪异模式)
  • full standards mode 完全标准模式,也被称作”no quirks mode”(无怪异模式)

在怪异模式中,浏览器会按照古老浏览器的事实标准去渲染页面

在完全标准模式中,浏览器会按照 W3C 标准去渲染页面

在准标准模式中,浏览器会尽可能地按照 W3C 标准去渲染页面,但此模式中仍存在少量的怪异行为

准标准模式和完全标准模式统称为标准模式

怪异模式

不同浏览器所实现的怪异模式是有差异的。

例如:IE 6-9 的怪异模式实际上是模拟 IE5.5 的行为,而 IE 10-11 的怪异模式则开始趋向于实现由 WHATWG(网页超文本应用技术工作小组)正在制订的怪异模式标准。也正因此,IE 6-9 的怪异模式下的盒模型与 IE 10-11 的怪异模式下的盒模型不同。

示例:IE 6-9 的怪异模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=5" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

示例:IE 11 的怪异模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE11" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

标准模式

受限于各个浏览器对标准支持程度的不同,不同浏览器所实现的标准模式是有差异的。

选择机制

自动推断

对于 HTML 文档来说,浏览器会根据文档类型声明来决定是采用怪异模式或是标准模式

  • 若文档类型声明为<!DOCTYPE html>,则浏览器会以完全标准模式渲染页面
  • 若文档类型声明不存在,则浏览器会以怪异模式渲染页面

注意:

  1. 文档类型声明必须置于 HTML 文档的首行。若文档类型声明前还有其他字符(例如:注释或 XML 声明),在 IE9 及以下的浏览器中会触发怪异模式
  2. 在 HTML5 中,使用文档类型声明的唯一目的就是触发完全标准模式

人为设定

IE8+ 实现了非 HTML 标准的 HTTP 响应头X-UA-Compatible,用于指定 IE 浏览器使用哪种模式渲染

注意:

  1. 仅 IE8+支持
  2. IE 浏览器会缓存X-UA-Compatible的值,若频繁变更同一个网页的X-UA-Compatible的值,必要时候需要重启 IE 浏览器才能看到变更后的效果(清除浏览数据无效)

示例:怪异模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=5" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

示例:若文档类型声明存在,IE8 的标准模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

示例:若文档类型声明不存在,IE8 的怪异模式

没有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

示例:无论文档类型声明存在与否,IE8 的标准模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

示例:若文档类型声明存在,当前浏览器所能支持的最高的标准模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

示例:若文档类型声明不存在,当前浏览器所能支持的最高的怪异模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<style>
#foo {
width: 100px;
height: 100px;
padding: 50px;
background-color: #f00;
}
#bar {
width: 100px;
height: 100px;
background-color: #00f;
}
</style>
<div id="foo"></div>
<div id="bar"></div>
<script>
alert(document.compatMode);
</script>
</body>
</html>

作用

compat,全称为”compatible”,中文意为兼容

document.compatMode用于表示文档的渲染模式到底是怪异模式还是标准模式

document.compatMode有两种取值:

  • BackCompat 怪异模式
  • CSS1Compat 标准模式

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/09/16/JavaScript%E4%B8%AD%E7%9A%84document-compatMode/


本文对你有帮助?请支持我


支付宝
微信