• 推荐
  • 评论
  • 收藏

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

2022-12-10    4352次浏览

摘要

  在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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/Leo_wl/p/2099593.html