好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SharePoint 2007运行 Edit In DataSheet 时在IE 6下页面卡死的分析

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下页面卡死的分析的详细内容...

  阅读:100次