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属性。

top:300px; z-index:105" style="display:none">

top:300px; z-index:105; display:none">

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