关键字: javascript、quirks mode、strict mode

在看js代码时,有时会看到关于quirks mode(怪异模式)和strict mode(严格格式)的东西,一直也没深究怎么回事,只是零零碎碎的有些概念,最近终于受不了这种似懂非懂的感觉,决定好好学习总结一下。

1、quirks mode和strict mode是浏览器解析css的两种模式,或者可以称之为解析方法。目前正在使用的浏览器这两种模式都支持

2、历史原因。


当早期的浏览器Netscape 4和Explorer 4对css进行解析时,并未遵守W3C标准,这时的解析方式就被我们称之为quirks
mode(怪异模式),但随着W3C的标准越来越重要,众多的浏览器开始依照W3C标准解析CSS,仿照W3C标准解析CSS的模式我们叫做strict
mode(严格模式).


3、后来的浏览器虽然支持strict mode,但众多浏览器并未放弃支持quirks mode。


个重要的原因就是为了之前大量在quirks
mode下开发的网页能够得到正确的显示。所以,这些支持两种模式的浏览器当拿到一张网页时,所做的一个前期工作就是判断采取何种方式进行解析(判断条件
后面会说)。注:Explorer 5仍然只支持quirks mode

4、浏览器如何判断何用哪种方式解析CSS?

解决方案就是采用doctype声明,大多数浏览器采用下面的这些判断规则

  •     浏览器要使老旧的网页正常工作,但这部分网页是没有doctype声明的,所以浏览器对没有doctype声明的网页采用quirks mode解析。
  •     对于拥有doctype声明的网页,什么浏览器采用何种模式解析,这里有一张详细列表可参考:http://hsivonen.iki.fi/doctype/
  •     对于拥有doctype声明的网页,这里有几条简单的规则可用于判断:

对于那些浏览器不能识别的doctype声明,浏览器采用strict mode解析

 

在doctype声明中,没有使用DTD声明或者使用HTML4以下(不包括HTML4)的DTD声明时,基本所有的浏览器都是使用quirks mode呈现,其他的则使用strict mode解析。


可以这么说,在现有有doctype声明的网页,绝大多数是采用strict mode进行解析的。


在ie6中,如果在doctype声明前有一个xml声明(比如:<?xml version="1.0" encoding="iso-8859-1"?>),则采用quirks mode解析。这条规则在ie7中已经移除了。


5、mozilla提出了almost strict moede ,和strict mode的区别是:

img元素在strict中是inline的,而在almost strict mode中是block的。其实我们前面所说,在大多数浏览器,大多数doctype声明触发的是almost strict mode;


6、quirks mode和strict mode最大的不同就是提现在对盒模式的解释上 ,这也是我们在js里要注意的地方。


什么是盒模式? 这是针对块级元素说的,我这里只简单说一下(详情请查阅相关资料)。说白了就是把块级元素想像成一个装东西的盒子,而margin,padding,border,width这些css属性构成了盒模式。

 

而区别就是产生在width属性上:


strict mode中

width是内容宽度
,也就是说,元素真正的宽度 = margin-left  +  border-left-width  +  padding-left  +
width  +  padding-right  +  border-right-width  +  margin-right;

 

quirks mode中

width则是元素的实际宽度
,内容宽度 = width  -  (margin-left  +  margin-right  +  padding-left  + 
padding-right  +  border-left-width  +  border-right-width)


这里把盒模式相关的东西记录一下,备忘


·内联元素

,例如<a>、<span>等,定义上下边界不会影响到行高(line-height),内联元素距离上一行元素的距离由行高决
定,而不是填充或边界。 注2.  内联元素(display: inline)
内联元素不需要在新行内显示,而且也不强迫其后的元素换行,如a、em、span等都为内联元素。内联元素可以为任何其他元素的子元素。

·浮动元素(无论左或者右浮动)边界不压缩 ,且若浮动元素不声明宽度,则其宽度趋向于0,即压缩到其内容能承受的最小宽度。

·如果盒中没有内容,则即使定义了宽度和高度都为100%,实际上只占0% ,因此不会被显示,此点在采取层布局的时候需特别注意。

·边界值可为负,其显示效果各浏览器可能不相同

·填充值不可为负

·边框默认的样式(border-style)为不显示(none)


7、在quirks mode 和 strict mode中还有一个区别 ,但没经过验证,我只是发现有这个现象。

strict mode 中,

table的css属性font-size会继承父级元素的 ,也就是说,table中的字体大小会继承父级元素字体的大小。

quirks mode 中,

table的css属性font-size不会继承父级元素的 ,需要专门设置一下。也就是说,table中的字体大小不会继承父级元素字体的大小。


8、在js中如何判断当前浏览器正在以何种方式解析?
document对象有个属性compatMode ,它有两个值:
BackCompat    对应quirks mode
CSS1Compat    对应strict mode

9、我们在编写跨浏览器兼容性的js代码时,常用到的判断代码(来源于ext)

Js
代码 <embed height="15" width="14"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash" allowscriptaccess="always"
quality="high"
flashvars="clipboard=%3Cstrong%3E%09var%20ua%20%3D%20navigator.userAgent.toLowerCase()%3B%0A%20%20%20%20%20%20%20%20var%20client%20%3D%20%7B%0A%20%20%20%20%20%20%20%20isStrict%3A%20%20%20document.compatMode%20%3D%3D%20'CSS1Compat'%2C%0A%20%20%20%20%20%20%20%20isOpera%3A%20%20%20%20ua.indexOf('opera')%20%3E%20-1%2C%0A%20%20%20%20%20%20%20%20isIE%3A%20%20%20%20%20%20%20ua.indexOf('msie')%20%3E%20-1%2C%0A%20%20%20%20%20%20%20%20isIE7%3A%20%20%20%20%20%20ua.indexOf('msie%207')%20%3E%20-1%2C%0A%20%20%20%20%20%20%20%20isSafari%3A%20%20%20%2Fwebkit%7Ckhtml%2F.test(ua)%2C%0A%20%20%20%20%20%20%20%20isWindows%3A%20%20ua.indexOf('windows')%20!%3D%20-1%20%7C%7C%20ua.indexOf('win32')%20!%3D%20-1%2C%0A%20%20%20%20%20%20%20%20isMac%3A%20%20%20%20%20%20ua.indexOf('macintosh')%20!%3D%20-1%20%7C%7C%20ua.indexOf('mac%20os%20x')%20!%3D%20-1%2C%0A%20%20%20%20%20%20%20%20isLinux%3A%20%20%20%20ua.indexOf('linux')%20!%3D%20-1%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20client.isBorderBox%20%3D%20client.isIE%20%26%26%20!client.isStrict%3B%0A%20%20%20%20%20%20%20%20client.isSafari3%20%3D%20client.isSafari%20%26%26%20!!(document.evaluate)%3B%0A%20%20%20%20%20%20%20%20client.isGecko%20%3D%20ua.indexOf('gecko')%20!%3D%20-1%20%26%26%20!client.isSafari%3B%0A%0A%20%20%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20%20%20*%20You're%20not%20sill%20using%20IE6%20are%20you%3F%0A%20%20%20%20%20%20%20%20%20*%2F%0A%20%20%20%20%20%20%20%20var%20ltIE7%20%3D%20client.isIE%20%26%26%20!client.isIE7%3B%3C%2Fstrong%3E"

src="http://kino.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf">

  1. <strong>    var ua = navigator.userAgent.toLowerCase();
  2. var client = {
  3. isStrict:   document.compatMode == 'CSS1Compat',
  4. isOpera:    ua.indexOf('opera') > -1,
  5. isIE:       ua.indexOf('msie') > -1,
  6. isIE7:      ua.indexOf('msie 7') > -1,
  7. isSafari:   /webkit|khtml/.test(ua),
  8. isWindows:  ua.indexOf('windows') != -1 || ua.indexOf('win32') != -1,
  9. isMac:      ua.indexOf('macintosh') != -1 || ua.indexOf('mac os x') != -1,
  10. isLinux:    ua.indexOf('linux') != -1
  11. };
  12. client.isBorderBox = client.isIE && !client.isStrict;
  13. client.isSafari3 = client.isSafari && !!(document.evaluate);
  14. client.isGecko = ua.indexOf('gecko') != -1 && !client.isSafari;
  15. /**
  16. * You're not sill using IE6 are you?
  17. */
  18. var ltIE7 = client.isIE && !client.isIE7;</strong>


var ua = navigator.userAgent.toLowerCase(); var client = {
isStrict: document.compatMode == 'CSS1Compat', isOpera:
ua.indexOf('opera') > -1, isIE: ua.indexOf('msie')
> -1, isIE7: ua.indexOf('msie 7') > -1,
isSafari: /webkit|khtml/.test(ua), isWindows:
ua.indexOf('windows') != -1 || ua.indexOf('win32') != -1, isMac:
ua.indexOf('macintosh') != -1 || ua.indexOf('mac os x') != -1,
isLinux: ua.indexOf('linux') != -1 };
client.isBorderBox = client.isIE && !client.isStrict;
client.isSafari3 = client.isSafari && !!(document.evaluate);
client.isGecko = ua.indexOf('gecko') != -1 &&
!client.isSafari; /** * You're not sill using IE6 are
you? */ var ltIE7 = client.isIE &&
!client.isIE7;
 

10、废话 :我不知道现在的很多js框架为什么还对解析模式进行了判断。我认为这些框架肯定是给现在要开发的项目使用的,那应该都是strict mode才对呀?是不是因为还有很多人不习惯给页面加上doctype声明呢?

广告交易平台

浏览器的两种模式quirks mode 和strict mode的更多相关文章

  1. Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...

  2. JSP中两种模式的总结

    运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...

  3. vue-router的两种模式的区别

    众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. ### hash模式 hash模式背后的原理是`onhashchange`事件,可以在`window ...

  4. Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?

    Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...

  5. CentOS 6 搭建SVN支持httpd和svnserve独立服务器两种模式 以及邮件配置

    Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号 服务器操作系统:CentOS 6.x 1.在服务器上安装配置SVN服务: 2.配置S ...

  6. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  7. vue路由的两种模式配置以及history模式下面后端如何配置

    vue路由的两种模式配置以及history模式下面后端如何配置 1.hash ——即地址栏URL中的#符号.hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变has ...

  8. vue--前端路由及vue-router两种模式

    前言 路由这个概念最早在后端出现,随后前后端分离,直至当今的单页面应用,路由也在一直发生变化.本文来总结一下路由变化和vue-router中的路由模式区别相关知识点. 正文 1.什么是前端路由 (1) ...

  9. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

随机推荐

  1. Sound Card Chip

      DELL sigmatel stac   Hewlett-packard conexant High Definition Audio chip   lenovo(IBM) Analo Devic ...

  2. tomcat用80port能够启动,可是浏览器不显示tomcat首页

    一.打开执行(ctrl+r)->输入cmd->确定->输入netstat -ano 结果检測到 :80port被system 占用,如图所看到的 打开进程发现确实被 PID为 4 的 ...

  3. 【剑指Offer学习】【面试题65:滑动窗体的最大值】

    题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4 ...

  4. jQuery無刷新上傳之uploadify簡單試用

    先簡單的侃兩句:貌似已經有兩個月的時間沒有寫過文章了,不過仍會像以前那样每天至少有一至兩個小時是泡在园子裏看各位大神的文章.前些天在研究“ajax無刷新上傳”方面的一些插件,用SWFUpload實現了 ...

  5. jmeter获取时间_time 函数

    原始时间戳13位精确到毫秒:${__time(,)} 时间戳精确到秒10位:${__time(/1000,)} 时间日期到年月日2019-04-21:${__time(yyyy-MM-dd,)} 时间 ...

  6. dm385和8127的区别

    DM385/DM8127在ITS智能交通中的应用分析德州仪器(TI)自推出DM385和DM8127视频处理器在业界反响很大特别是深圳安博会上展出的1080P60帧高清效果之后很多龙头企业也跃 ...

  7. 蜘蛛页面 获取一个网站的全部url 乐观代码

    蜘蛛页面 from selenium import webdriver import time import random from bs4 import * import pymysql h, pt ...

  8. oracle-扫盲贴:存储过程实现增删改查

    原文引入:http://blog.csdn.net/yangzhawen/article/details/8617179 oracle-扫盲贴:存储过程实现增删改查 分类: oracle2013-02 ...

  9. 【Codevs1183】泥泞的道路

    Position: http://codevs.cn/problem/1183/ List Codevs1183 泥泞的道路 List Description Input Output Sample ...

  10. 14. extjs中treepanel属性和方法

    转自:http://www.cnblogs.com/connortang/p/4414907.html 1.Ext.tree.TreePanel 主要配置项: root:树的根节点. rootVisi ...