您的位置:首页 > 其它

SharePoint 2007运行 Edit In DataSheet 时在IE 6下页面卡死的分析和处理方法

2011-07-06 22:17 537 查看
摘要

在IE6打开”EditInDatasheet”在sharepoint2007的list页面时,会造成页面卡死的情况,CPU这时的运行占到50%+以上,但是在IE8打开时没有问题。

原因分析

造成这个原因时,我们分析,在MasterPage页面,可能是我们写的Js造成的,但是,把所有的JS注释掉后,这个问题依然存在,己是把所有自己写的css注释掉后,这个问题没有了,然后就是一块代码一块代码的调试,终于找到造成这个问题的代码。如下:

1
#main-content-block{
2
margin:0auto;
3
padding:20px020px0;
4
width:100%;
5
text-align:left;
6
*height:65%;
7
vertical-align:top;
8
}
分析原因,改成如下时就可以运行:

1
#main-content-block{
2
margin:0auto;
3
text-align:left;
4
vertical-align:top;
5
}
就是把定义长度、宽度和内边距的代码去掉,就可以运行了,分析可能是JS在计算Datasheet的宽度和长度时产生了自循环,造成卡死状态。

经查找是在sharePoint自带的core.js中的一段代码有计算datasheet的宽度和长度。

core.js位置:C:\ProgramFiles\CommonFiles\MicrosoftShared\webserverextensions\12\TEMPLATE\LAYOUTS\1033\core.js

js代码是:

01
functionGCComputeSizing(GCObject)
02
{
03
if
(TestGCObject(GCObject))
04
{
05
varfBIDI=(document.documentElement.currentStyle.direction==
"rtl"
);
06
varlGCWindowWidth=document.documentElement.scrollWidth;
07
varlGCWindowHeight=document.documentElement.scrollHeight;
08
varlGCObjectOffsetLeft=0;
09
varlGCObjectOffsetTop=0;
10
if
(fBIDI)
11
{
12
lGCObjectOffsetLeft=-180;
13
lGCObjectOffsetTop=120;
14
}
15
else
16
{
17
lGCObjectOffsetLeft=32;
18
lGCObjectOffsetTop=-2;
19
}
20
varlGCObjectWalker=GCObject.parentElement;
21
while
(lGCObjectWalker!=document.body)
22
{
23
lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
24
lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
25
lGCObjectWalker=lGCObjectWalker.offsetParent;
26
if
(fBIDI)
27
if
(lGCObjectWalker.offsetLeft>0)
28
break
;
29
}
30
lGCObjectOffsetLeft+=GCObject.parentElement.offsetLeft;
31
lGCObjectOffsetTop+=GCObject.parentElement.offsetTop;
32
glGCObjectHeight=lGCWindowHeight-lGCObjectOffsetTop;
33
if
(glGCObjectHeight>lGCWindowHeight)
34
glGCObjectHeight=lGCWindowHeight
35
if
(glGCObjectHeight<cGCMinimumHeight)
36
glGCObjectHeight=cGCMinimumHeight;
37
if
(fBIDI)
38
{
39
glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
40
}
41
else
42
glGCObjectWidth=lGCWindowWidth-lGCObjectOffsetLeft;
43
if
(glGCObjectWidth>lGCWindowWidth)
44
glGCObjectWidth=lGCWindowWidth;
45
if
(glGCObjectWidth<cGCMinimumWidth)
46
glGCObjectWidth=cGCMinimumWidth;
47
}
48
}
这两行代码是取得长度和宽度的:

1
varlGCWindowWidth=document.documentElement.scrollWidth;
2
3
varlGCWindowHeight=document.documentElement.scrollHeight;
我们在这段代码里加上alert(“1”);时,发现这个1一直弹出来,而datasheet一直在改变,datasheet的长度和宽度一直在增长。原因找到了。

处理方式:

当datasheet达到IE的适合长度和宽度时,停止计算,从而停止这个方法的运行。

代码改为如下:

01
if
($.browser.msie&&$.browser.version==
"6.0"
){
02
03
functionGCComputeSizing(GCObject)
04
{
05
alert(
"newone"
);
06
if
(TestGCObject(GCObject))
07
{
08
varfBIDI=(document.documentElement.currentStyle.direction==
"rtl"
);
09
varlGCWindowWidth=document.documentElement.scrollWidth>document.documentElement.clientWidth?document.documentElement.clientWidth:document.documentElement.scrollWidth;
10
varlGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight)?document.documentElement.clientHeight:document.documentElement.scrollHeight;
11
varlGCObjectOffsetLeft=0;
12
varlGCObjectOffsetTop=0;
13
if
(fBIDI)
14
{
15
lGCObjectOffsetLeft=-180;
16
lGCObjectOffsetTop=120;
17
}
18
else
19
{
20
lGCObjectOffsetLeft=32;
21
lGCObjectOffsetTop=-2;
22
}
23
varlGCObjectWalker=GCObject.parentElement;
24
while
(lGCObjectWalker!=document.body)
25
{
26
lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
27
lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
28
lGCObjectWalker=lGCObjectWalker.offsetParent;
29
if
(fBIDI)
30
if
(lGCObjectWalker.offsetLeft>0)
31
break
;
32
}
33
lGCObjectOffsetLeft+=GCObject.parentElement.offsetLeft;
34
lGCObjectOffsetTop+=GCObject.parentElement.offsetTop;
35
glGCObjectHeight=lGCWindowHeight-lGCObjectOffsetTop;
36
if
(glGCObjectHeight>lGCWindowHeight)
37
glGCObjectHeight=lGCWindowHeight
38
if
(glGCObjectHeight<cGCMinimumHeight)
39
glGCObjectHeight=cGCMinimumHeight;
40
if
(fBIDI)
41
{
42
glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
43
}
44
else
45
glGCObjectWidth=lGCWindowWidth-lGCObjectOffsetLeft;
46
if
(glGCObjectWidth>lGCWindowWidth)
47
glGCObjectWidth=lGCWindowWidth;
48
if
(glGCObjectWidth<cGCMinimumWidth)
49
glGCObjectWidth=cGCMinimumWidth;
50
}
51
}
52
}
加上了判断是在IE6下时才运行此方法,把这个方法加在masterpage上,它会把core.js的方法给重载掉,再运行就没有问题了。

关键代码:

1
varlGCWindowWidth=document.documentElement.scrollWidth>document.documentElement.clientWidth?document.documentElement.clientWidth:document.documentElement.scrollWidth;
2
varlGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight)?document.documentElement.clientHeight:document.documentElement.scrollHeight;
当宽度大于浏览器的宽度时,停止计算。

作者:springyang

出处:http://www.cnblogs.com/springyangwc/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐