SharePoint 2007运行 Edit In DataSheet 时在IE 6下页面卡死的分析和处理方法
摘要
在IE 6打开”Edit In Datasheet” 在sharepoint 2007的list页面时,会造成页面卡死的情况,CPU 这时的运行占到50% +以上,但是在IE 8打开时没有问题。
原因分析
造成这个原因时,我们分析,在MasterPage页面,可能是我们写的Js造成的,但是,把所有的JS注释掉后,这个问题依然存在,己是把所有自己写的css 注释掉后,这个问题没有了,然后就是一块代码一块代码的调试,终于找到造成这个问题的代码。如下:
1 #main-content-block {
2 margin:0 auto;
3 padding:20px 0 20px 0;
4 100%;
5 text-align:left;
6 * height:65%;
7 vertical-align:top;
8 }
分析原因,改成如下时就可以运行:
1 #main-content-block {
2 margin:0 auto;
3 text-align:left;
4 vertical-align:top;
5 }
就是把定义长度、宽度和内边距的代码去掉,就可以运行了,分析可能是JS在计算Data sheet的宽度和长度时产生了自循环,造成卡死状态。
经查找是在sharePoint 自带的core.js中的一段代码有计算data sheet的宽度和长度。
core.js 位置:C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\1033\core.js
js代码是:
01 function GCComputeSizing(GCObject)
02 {
03 if (TestGCObject(GCObject))
04 {
05 var fBIDI=(document.documentElement.currentStyle.direction== "rtl" );
06 var lGCWindowWidth=document.documentElement.scrollWidth;
07 var lGCWindowHeight=document.documentElement.scrollHeight;
08 var lGCObjectOffsetLeft=0;
09 var lGCObjectOffsetTop=0;
10 if (fBIDI)
11 {
12 lGCObjectOffsetLeft=-180;
13 lGCObjectOffsetTop=120;
14 }
15 else
16 {
17 lGCObjectOffsetLeft=32;
18 lGCObjectOffsetTop=-2;
19 }
20 var lGCObjectWalker=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 var lGCWindowWidth=document.documentElement.scrollWidth;
2
3 var lGCWindowHeight=document.documentElement.scrollHeight;
我们在这段代码里加上alert(“1”);时,发现这个1一直弹出来,而data sheet一直在改变,data sheet的长度和宽度一直在增长。原因找到了。
处理方式:
当data sheet达到IE的适合长度和宽度时,停止计算,从而停止这个方法的运行。
代码改为如下:
01 if ($.browser.msie && $.browser.version== "6.0" ){
02
03 function GCComputeSizing(GCObject)
04 {
05 alert( "new one" );
06 if (TestGCObject(GCObject))
07 {
08 var fBIDI=(document.documentElement.currentStyle.direction== "rtl" );
09 var lGCWindowWidth=document.documentElement.scrollWidth>document.documentElement.clientWidth?document.documentElement.clientWidth:document.documentElement.scrollWidth;
10 var lGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.documentElement.scrollHeight;
11 var lGCObjectOffsetLeft=0;
12 var lGCObjectOffsetTop=0;
13 if (fBIDI)
14 {
15 lGCObjectOffsetLeft=-180;
16 lGCObjectOffsetTop=120;
17 }
18 else
19 {
20 lGCObjectOffsetLeft=32;
21 lGCObjectOffsetTop=-2;
22 }
23 var lGCObjectWalker=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下时才运行此方法,把这个方法加在master page 上,它会把core.js的方法给重载掉,再运行就没有问题了。
关键代码:
1 var lGCWindowWidth=document.documentElement.scrollWidth>document.documentElement.clientWidth?document.documentElement.clientWidth:document.documentElement.scrollWidth;
2 var lGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.documentElement.scrollHeight;
当宽度大于浏览器的宽度时,停止计算。
作者: spring yang
出处: http://www.cnblogs.com/springyangwc/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于SharePoint 2007运行 Edit In DataSheet 时在IE 6下页面卡死的分析的详细内容...