- 浏览: 1461809 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
IE 版本实在太多了,而且每个版本又变化很大,出到 IE9 连微软都开始担心开发者能否搞定,于是就有了这篇官方博文,详细介绍了自 IE8 起引入的兼容性解决方案:
Testing sites with Browser Mode vs. Doc Mode
浏览器模式
不受程序员控制,用户可以自由选择合适的ie版本,影响了以下三个方面:
1.发送给服务器合适的UA
2.控制页面中的条件注释 。(条件注释依赖于 UA 串)
3.对应了默认的文本模式(渲染模式,IE8 引入document.Mode)。
关于默认对应关系可见:
updated 2010-10-24
ie UA 判断需要考虑渲染引擎版本 trident
兼容模式和其他模式的区别在于,兼容模式会在UA中表示自己是 MSie7 但是同时也会表示自己的渲染引擎是trident 5.0,如下:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
但是选择ie7模式时,则会完全丢弃掉trident版本:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
一般来说,终端用户可选择兼容模式(地址栏兼容按钮),但是开发者通过 trident 仍然可以知道真正的浏览器版本,其他模式主要用于程序员调试(程序完全不知),终端用户如果选择后果自负!
比如一个 ie9 问题,当程序设置 document mode 处于 ie9 时,透明度 filter 设置会失效即透明失效,即使设置了opacity,这是就可以根据trident来判断,无论是 MSIE7.0 (兼容模式)还是 MSIE9.0(ie9模式) [具体哪种模式受微软白名单控制以及用户选择],都把filter去掉,具体方法则是初始化时在页面body上加入class:tridentxx,在样式中写明:
<body class='trident5'> .trident5 xx{ filter:none; }
文本模式
直接和界面显示相关,用来指示选择具体的渲染引擎,例如 ie8 标准模式下不支持 css表达式。脚本可以通过 document.documentMode 探测。
updated 2010-11-10
当切换 document.documentMode ,不仅会切换渲染引擎,而且会切换 js 引擎,可在切换前后分别执行以下程序测试:
typeof Object.create
可以通过以下方面由程序员控制
1. 页面中的 DOCTYPE 属性。
需要注意的是:实际上从 ie8 起存在 3 种渲染机制,目前推荐 <!DOCTYPE html>触发完全标准模式。
其他详见:Quirks mode、Almost standards mode、Standards mode
可以在 head 开头 插入 meta 标签:
<meta http-equiv="X-UA-Compatible" content="IE=mode" >
mode 取值结合 1 DOCTYPE 会直接影响到使用哪个渲染引擎:
更详细的见这里:how-ie8-determines-document-mode
3. HTTP Header
同2,不过直接操作 http 协议头,需要注意的是 2 的优先级比 3 高。
最后 如果还不能够确定,那么 ie 的兼容性列表 也会影响到具体表现,可在
res://iecompat.dll/iecompatdata.xml
查看,用户也可在 工具-兼容性视图设置 下手动设置,将特定网站加入兼容性列表。
update 2010-11-17 :
attribute 与 property , content value 与 dom value
attribute 的判断读取 在 ie <9 之前是非常混乱的事情,节点的 .attributes 在标准浏览器下只会返回用户设置的属性节点集合,而在 ie<8 下则会把所有可以设置的属性都返回过来,特别在需要知道某个元素是否被用户设置了属性时就会十分麻烦,需要遍历.attributes 一一判断 specified 是否为 true ,而 documentMode 也会切换 js 引擎,在 ie8 的文本模式选择了 ie7 标准时,其属性方面和真实的 ie7 表现一致,那么这时为了鲁棒性需要这样判断:
//直接判断引擎,防止兼容性模式影响 var ieEngine=(function() { if (!UA.ie) return; return document.documentMode || UA.ie; })(); var hasAttributes = ieEngine < 8 ? function (el) { var attributes = el.attributes; for (var i = 0; i < attributes.length; i++) { var attribute = attributes[i]; if (attribute.specified) { return true; } } return false; } : function (el) { //删除firefox自己添加的标志 UA.gecko && el.removeAttribute("_moz_dirty"); return el.hasAttributes(); }
关于 attribute 与 property 的关系就更复杂了,在 ie6,7 下表示 content value 的attribute 与表示 dom value 的 property 混淆了,并且在 ie8 documentMode 为混杂以及 ie7 模式下和 ie6,7 保持一致,如下:
<a href='../x.html' id='t'>test</a> <script> var a=document.getElementById("t"); alert(a.getAttribute("href")); alert(a.getAttribute("href",2)); </script>
另一点需要注意的是,设置 innerHTML 在 ie6,7 下会触发设置的 content value 转换成为dom value,当然这只对 html 相关属性起作用,只有 html 属性才可能有不同于 content value 的 dom value。如下:
<div id='tt'> <a href='../x.html' id='t' _saved_href='../x.html'>test</a> </div> <script> var tt=document.getElementById("tt"); alert(tt.innerHTML); tt.innerHTML=tt.innerHTML; alert(tt.innerHTML); </script>
单个属性节点存在判断:
在 ie 下可用:
elem.attributes[name] && elem.attributes[name].specified
但是对于多个单词组成的属性,例如 tabindex 会出问题,最好用
var name='tabindex'; elem.tabIndex=1; var attr = elem.getAttributeNode(name); return attr ? attr.specified : false;
来判断。
而对于 attribute 和 property 还没有完全分开,如果设置自定义属性/expando,那么会发现无论读 expando 还是 attribute 都可以读出来 :(
var o=document.body; o.xx="oo"; o.setAttribute("xx2","oo2"); alert(o.xx); alert(o.getAttribute("xx")); alert(o.xx2); alert(o.getAttribute("xx2"));
ie9 则是完全解决了
具体可见:
PS: 这个工
具也不错
Introducing the IE8 Developer Tools JScript Profiler
其他文章:
IE’s Compatibility Features for Site Developers
Beyond DOCTYPE: Web Standards, Forward Compatibility, and IE8
Internet Explorer 8 document and browser modes
发表评论
-
continuation, cps
2013-09-12 16:49 2797起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3401一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14091cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5361目前在传统的软件开 ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5047最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6428css 2d transform 是 css3 引入的一个新的 ... -
promise api 与应用场景
2012-02-07 17:34 7382promise 是 commonjs 社区中提出的异步规范,其 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2832closure compiler 可以进行不少有意思的优化 ... -
write html parser
2011-12-01 02:48 2918首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6449兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3223背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2980如果不想考虑浏览器间 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2847简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2847场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2269分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7051作为前端开放的基础安全保证,caja 是目前比较合 ... -
tokenization of html
2011-08-29 22:38 2789html 符号解析问题 场景: 在页面上输出包 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2478这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
循环引用下的深度克隆
2011-08-04 20:39 2308深度复制和浅度复制 是当初初学 c 遇到的第一批问题,似乎使 ... -
模块的静态与动态循环依赖
2011-07-25 03:43 3281场景: 循环依赖 我是不支持的,但现实中似乎又确实需 ...
相关推荐
VB API文本浏览器是一种基于Visual Basic (VB) 开发的简单应用程序,它利用Windows API (Application Programming Interface) 来实现对文本文件的浏览功能。在VB的默认库中,可能并未包含高级的文本浏览特性,因此...
下面将详细介绍Linux图形模式与文本模式的概念、用途及切换方法。 一、Linux图形模式 1. **概念**:图形模式提供了一个直观的桌面环境,用户可以通过鼠标和图标来操作各种应用程序,如文件管理器、浏览器、编辑器...
本程序是自己练习多线程异步回调时的作品,可以利用线程加载指定目录下的所有文件,并进行各种模式的搜索。对于委托和多线程不了解得同学可以好好研究,相信大有裨益。
**RFC文本文件浏览器** 在信息技术领域,RFC(Request for Comments)文档是标准制定过程中的重要组成部分,用于记录和讨论技术规范、协议以及建议。RFC文本文件浏览器是一款专门设计用来查看和阅读这些文档的软件...
标题中的“带夜间模式的浏览器”指的是具有夜间模式功能的互联网浏览应用,这种浏览器能够适应低光照环境,减少屏幕亮度,降低对用户眼睛的刺激,同时在夜间使用时节省电池。这种模式通常通过调整界面颜色方案,将...
7. **兼容性与跨平台**:格式文本浏览器通常兼容不同的操作系统,如Windows、Mac OS和Linux,确保用户无论在哪种设备上都能使用。 8. **安全性**:为了保护用户的隐私和数据安全,软件可能包含加密或安全措施,防止...
Java的文本浏览器是一种基于Java编程语言开发的轻量级应用程序,主要用于查看和处理文本文件。在本项目中,我们关注的是一个简化的版本,它的主要目的是帮助开发者学习和理解如何在Java中实现文本的高亮显示和其他...
1. **下载与导入**:首先从可靠来源下载这个版本的插件文件,然后在打开的浏览器中进入扩展管理页面(通常是`chrome://extensions/`),开启“开发者模式”,点击“加载已解压的扩展程序”,选择包含".crx"文件的...
通过研究这个开源项目,开发者不仅可以学习到 Android 浏览器的实现细节,还能掌握夜间模式的设计与实现,同时提高对Android系统、网络编程、用户界面设计等方面的理解,是提升Android开发技能的宝贵资源。
在数字化时代,虽然图形用户界面的浏览器已经占据了主导地位,但文本模式的浏览器依然有着其独特的应用场景和价值。w3m,作为一款优秀的文本浏览器,以其简洁、高效的特点,深受程序员和终端爱好者喜爱。本文将对w3m...
此外,酷影模式具备广告过滤功能,内置了自主知识产权的广告过滤插件,能够自动屏蔽各种浮动广告、弹窗广告以及文本广告,为用户提供一个清爽的浏览环境。同时,它还能防止木马和钓鱼网站的侵扰,保护用户的网络安全...
基于 Java 语言的浏览器设计与实现 本资源摘要信息将详细介绍基于 Java 语言的浏览器设计与实现的知识点。 1. 浏览器的设计与实现 浏览器是互联网上查找信息的重要工具,给人们提供了巨大而又宝贵的信息财富。...
文本浏览器的核心功能可能包括打开、浏览、搜索、编辑纯文本文件,支持书签、夜间模式、自定义字体大小等特性。对于Geimei x760+这样的设备,它可能是用户阅读电子书籍、查看文档或处理简单文本任务的主要工具,尤其...
浏览器清爽阅读模式是一种提高在线阅读体验的功能,尤其适用于那些希望减少网页中干扰因素,专注于文本内容的用户。本文主要介绍了如何在Google Chrome浏览器中利用Readability插件实现这一功能。 Readability是一...
“chm文本文件浏览器(简单易用)”是一款专门设计用于浏览和阅读CHM文件的工具。这款浏览器旨在提供用户友好的界面和便捷的操作方式,使得非技术背景的用户也能轻松查阅CHM文件中的内容。它的主要功能可能包括: 1...
这包括调整兼容性视图设置、单个页面的浏览器模式和文本模式等。此外,对于使用第三方浏览器的用户来说,还需要特别注意兼容模式的选择,以及每次模式切换后的重新设置。通过遵循上述步骤,可以有效解决由浏览器版本...
安装CRX文件需要在Chrome的扩展管理界面开启开发者模式,然后拖拽CRX文件进行安装。 "去脚本之家看看.url"和"服务器软件.url"看起来像是链接,可能指向提供网络编程或服务器软件相关资源的网站。这些网站可能包含...
1. **网络编程**:在“北大青鸟的新闻浏览器”中,C#的网络编程接口(如System.Net命名空间)被用于与互联网进行通信。HTTP请求和响应的处理是通过HttpWebRequest和HttpWebResponse类来实现的,这些类使得浏览器能够...