2024年1月31日发(作者:)
8/30/2010
IE 8兼容性分析
经验
分享
Internet Explorer
专家级工程师
梅开盛
IE的”进程-线程-窗口”架构演化(6-7-8)。
如何利用IE 8的兼容模式。
IE 8中针对JavaScript的改动及注意事项。
小议IE的安全机制。
有效的利用IE8的开发工具栏。
如何使用Application Compatibility
Toolkit(ACT)快速定位兼容性问题。
热点问题讨论(内存泄露,脚本性能,并发连接数限制)。
2
1
8/30/2010
3
4
2
8/30/2010
5
选项卡与框架(frame)分离,不在同一进程中
同一窗口下不同的选项卡可能运行在不同的进程中.
同一窗口下不同的选项卡可能有不同的完整性级别(与IE7不同)
演示 -- 谁在选项卡进程异常退出后恢复?
6
3
8/30/2010
7
HKCUSoftwareMicrosoftInternet ExplorerMain –
TabProcGrowth
TabProcGrowth=0: 恢复IE7模式.
TabProcGrowth =1: 一个框架进程下(frame process)只有一个标签页进程(tab process)
注:如果启用保护模式,则有可能是两个,即每个模式下一个页面进程
TabProcGrowth = n;n>1:
在一个完整性级别下,最多有n个选项卡进程,达到限制后,标签管理器负责负载平衡。
8
4
8/30/2010
HKCUSoftwareMicrosoftInternet ExplorerMain -
FrameMerging(dword) //帧合并
0 – 关闭
1 – 打开 (缺省)
“FrameMerging” (MFP/帧合并) 打试图打开一个新IE进程时,IE自己会创建一个新的选项卡,并把它合并到一个现存的框架进程中。
使用参数覆盖系统设定:
“-FrameMerging” – 强制合并 “
“-NoFrameMerging” – 强制打开建立一个新的框架进程。.
9
HKCUSoftwareMicrosoftInternet ExplorerMain -
SessionMerging(dword) //会话合并
0 – 关闭
1 – 打开 缺省
如果关闭,打开一个,虽然在帧合并的情况下,但是会有一个新的选项卡进程打开。这个进程和前面的选项卡进程不共享会话。
目前为止并没有公开的文档
最简单的理解方法:FrameMerging = 1, TabProcGrowth = 1,
SessionMerging = 0. 点击IE图标,打开IE窗口,看几个进程创建,再次点击IE图标,看几个进程。分别在两个窗口里登陆某个网站。
10
5
8/30/2010
用户在登陆一些使用通过SSL Session State实现网络负载均衡的网站时可能反复出现登陆界面
/?scid=kb;EN-US;977417
规避方法: TabProcGrowth = 0/1.
11
在保护模式下()无法把最小化的窗口前置
/?scid=kb;EN-US;979954 (单选项卡)
12
6
8/30/2010
()和()无法正确切换焦点窗口
/kb/973528/en-us
13
标准 与 兼容
W3C HTML 4.01/5
W3C CSS 1/2.1/3
ECMAScript (ECMA262 2009-12)
标准要支持,不标准要尽量兼容
14
7
8/30/2010
CSS 2.1 compliance
DOM Improvements
CSS 2.1
HTML Improvements
Acid2 Test compliance
HTML
This means
Data URI Support
Improved
Namespace
Support
ACID 2
And more
/css/
对CSS不同的阐释
/wiki/Quirks_mode
8
8/30/2010
content="IE=EmulateIE7" />
Content Value Meaning
IE=5
“Quirks” mode
IE=7
Always use IE7 mode
IE=EmulateIE7
Display in IE7 mode unless site has
“Quirks” DOCTYPE
IE=8
Always use IE8 mode
Use this tag to override compatibility
IE=EmulateIE8
view on client machines and force IE8
mode
IE=Edge
Display in latest mode; In the IE8
release, this is equivalent to IE=8
Compatibility Mode Options
X-UA-Compatible: IE=EmulateIE7
File
18
9
8/30/2010
和不同的是,如果没有特殊设定,使用EmulateIE7模式。
HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet
ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION
= [DWORD]
值 含义
7000 等于EmulateIE7
8000 等于EmulateIE8/IE。缺省,被兼容性视图设置覆盖
8888 等于EmulateIE8,会覆盖后面讲到的兼容性视图设置
19
缺省,本地站点网页都显示在兼容模式。
Microsoft会维护一张列表。
优先级别低。
类似EmulateIE7
注意! 客户端的User Agent
String会变成ie7.
20
10
8/30/2010
解决兼容性问题的方向
更加积极的用户体验
无法预估的用户体验
偏向服务器或代码修改
偏向客户端修改
3. 用兼容模式显示
1. 代码符合 IE8
2. 利用 X-UA-本地站点
标准模式
Compatible 标签
4. 依靠IE8兼容5. 依靠客户手站点列表
动点击兼容模式
标准模式下有问题,兼容性模式下没有
脚本错误+进度图片始终显示
22
11
8/30/2010
两个症状,先看哪个?如何入手?
脚本错误,使用脚本调试工具,IE8自带。
定位错误代码,分析上下文,了解大体流程。
尽量简化代码以创建本地复现代码。
原代码调试分析找出根源和解决方法
在本地例子里测试解决方法。
提供给客户解决方法。
23
function(a,d,e){if(!a._events) <---- // a is null
$addHandler($get("ctl00$ContentPlaceHolder1$BtnQuery"),"click",Submit_Click);
mentById()
id="ctl00_ContentPlaceHolder1_BtnQuery" style="width:56px;" />
ID 和 Name. attaya6400/ie8/
原因:在IE8模式下面,getElementById只搜索id,在IE7下对于大多数元素同时搜索id和name.
解决方法,使用id而不是name.
24
12
8/30/2010
思路:图片应该何时显示,何时消失?
对于一般的ajax应用,发出xmlhttprequest,显示图片,等待state change,
xmlhttprequest结束后隐藏图片。
通过live meeting 连接到客户机器。
25
打开页面,图片显示,并没有任何ajax请求发出。
点击启用兼容性视图,问题确实消失。
察看图片的css属性。
26
13
8/30/2010
有一个网页,添加了下面一样就有问题。
content="IE=8"/>
现场演示
错误在哪里?
27
Onload -> setupFeedTable() ->
ribute("onclick", callback);
Click -> getLoadFeed() -> 增加新的cell.
点击之后出的问题:
A. onclick 函数没有设置好
B. getLoadFeed()执行出问题
28
14
8/30/2010
在IE8 标准模式下,setAttribute 第二个参数必须是字符串。
Callback 是一个函数. 表现成是[object]
点击的时候就执行”{[object]}”
解决方案:
Event("onclick", callback);
不强制该页面运行在IE8标准模式下。
29
客户端把网站加入兼容性视图列表
网页包含 。
页面显示不正常。
如果移除标签,问题消失。
如果不加入兼容性视图列表,问题消失。
30
15
8/30/2010
标签覆盖兼容性视图设定
IE8使用IE8标准显示网页。
察看网络包,发现服务器返回不同的.css文件。
服务器端代码根据User Agent String返回不同css代码.
把为IE7设计的CSS在IE8标准模式下显示。
31
/b/ie/archive/2009/03/12/
32
16
8/30/2010
跨域请求(XDR)XDomainRequest
客户端通过Origin表明发出请求页面的服务器名
目标服务器端判断,如果允许,返回HTTP头
Access-Control-Allow-Origin */URL
DOM 储存 (DOM Storage)
sessionStorage (演示)
localStorage (演示)
/kb/975624
使用localStorage的时候,尽量把数据合并起来,以减少写次数。
33
X-FRAME-OPTIONS (演示)
DENY 不允许
SAMEORIGIN 只允许同域下面的网页引用
X-Download-Options (演示)
配合Content-Disposition
强制保存
X-Content-Type-Options (演示)
传统IE的mime 检测
Nosniff 让客户端尊重服务器的设定
34
17
8/30/2010
IE8 新增功能大纲
IE8 安全九步曲(1,2,3,4,5,6,7,8,9)
35
传统的,以安全区域为基础的。
IE 6 @ XP SP2以后的Feature_Control注册表值控制的。
36
18
8/30/2010
四大安全区域+本地安全区域
对应注册表
每个安全选项都有一个DWORD值代表
一一对应,解释大全
IE如何判断本地站点?
名字里是否带点”.”
是否不通过代理
是否是UNC路径
IE 7/8的自动检测功能
37
本地站点和受信任站点哪个安全限制更低?
如果发现我正在开发的网站和我本地安全区域的设定冲突,最好的解决方法是什么?
请解释下自动登录下面四个选项的具体含义?
关于如何部署安全区域设定,你们有什么推荐?
38
19
8/30/2010
IE 6,受信任站点安全限制最低。
IE7 on Vista SP2,IE8, 受信任站点运行在中等级别上。而本地站点运行在中等偏下。
39
从代码方面避免这个冲突。
把站点放入合理的安全区域
比如公司内部使用的应用,一般应该放在本地站点中。
目前很多网银在安装包中都会把站点加入受信任站点。
最好在安装过程中说明
40
20
8/30/2010
缺省只有本地站点才会自动登录
例外1: 如果验证方式是基础验证Basic
Authentication.
例外2:在IE7SP1以后,如果站点被明确加到受信任站点,但是根据三个判断条件属于本地站点的时候,仍旧会自动登陆
41
使用组策略
使用IE维护策略
用户可以修改,虽然在gpupdate的时候再会被改回来。
配合其他组策略,如禁用安全页。
使用管理模板-> Windows 组件 ->Internet
Explorer -> Internet 控制面板 ->安全页
用户无法修改,选项为灰色。
如果站点区域映射设置,用户无法添加新映射。
42
21
8/30/2010
在Windows XP SP2的时候出现。
IE 7中作了大量修改。
基于注册表,并没有用户界面修改设定。
Feature control 大全
大部分可以通过ACT检查出来。
演示
43
前身是Internet Explorer Developer
Toolbar
由于非常成功,包含在IE8中
脚本调试
DOM元素实时属性察看
脚本性能测试器
44
22
8/30/2010
包含在应用程序兼容性测试工具集中
单独exe存在。
先打开并启用工具,然后打开IE,访问测试网站
对应事件的解释
/zh-cn/library/dd565632(VS.85).aspx
45
由JavaScript和DOM双向引用引起的内存泄露
产生模式
08年的时候修复绝大部分内存泄露:补丁
IE8直接加载xml文件时产生内存泄露: 补丁
Xml的 onreadystatechange
46
23
8/30/2010
JavaScript的性能问题
提高性能三重奏(1,2,3)
尽量缓存一些常用的DOM元素
47
IE的并发连接数问题
根据HTTP1.1, IE6/7下,每个进程对同一个服务器有2个并发连接的限制。
IE 8修改到6
如果两个连接用尽,新建的异步连接就会被阻止,同步连接将会阻塞UI线程。
某些情况下AJAX请求有可能导致连接泄露。
/kb/886710
演示
48
24
8/30/2010
49
25


发布评论