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

摘要

  在IE 6打开”Edit In Datasheet” 在sharepoint 2007的list页面时,会造成页面卡死的情况,CPU 这时的运行占到50% +以上,但是在IE 8打开时没有问题。

 

原因分析

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

1
2
3
4
5
6
7
8
#main-content-block {
    margin:0 auto;
    padding:20px 0 20px 0;
    width:100%;
    text-align:left;
    * height:65%;
    vertical-align:top;
}

 

 

分析原因,改成如下时就可以运行:

1
2
3
4
5
#main-content-block {
    margin:0 auto;
    text-align:left;
    vertical-align:top;
}

 

 

就是把定义长度、宽度和内边距的代码去掉,就可以运行了,分析可能是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代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function GCComputeSizing(GCObject)
{
    if (TestGCObject(GCObject))
    {
        var fBIDI=(document.documentElement.currentStyle.direction=="rtl");
        var lGCWindowWidth=document.documentElement.scrollWidth;
        var lGCWindowHeight=document.documentElement.scrollHeight;
        var lGCObjectOffsetLeft=0;
        var lGCObjectOffsetTop=0;
        if (fBIDI)
            {
            lGCObjectOffsetLeft=-180;
            lGCObjectOffsetTop=120;
            }
        else
            {
            lGCObjectOffsetLeft=32;
            lGCObjectOffsetTop=-2;
            }
        var lGCObjectWalker=GCObject.parentElement;
        while (lGCObjectWalker !=document.body)
        {
            lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
            lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
            lGCObjectWalker=lGCObjectWalker.offsetParent;
            if (fBIDI)
                if (lGCObjectWalker.offsetLeft > 0)
                    break;
        }
        lGCObjectOffsetLeft+=GCObject.parentElement.offsetLeft;
        lGCObjectOffsetTop+=GCObject.parentElement.offsetTop;
        glGCObjectHeight=lGCWindowHeight - lGCObjectOffsetTop;
        if (glGCObjectHeight > lGCWindowHeight)
            glGCObjectHeight=lGCWindowHeight
        if (glGCObjectHeight < cGCMinimumHeight)
            glGCObjectHeight=cGCMinimumHeight;
        if (fBIDI)
            {
            glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
            }
        else
            glGCObjectWidth=lGCWindowWidth - lGCObjectOffsetLeft;
        if (glGCObjectWidth > lGCWindowWidth)
                glGCObjectWidth=lGCWindowWidth;
        if (glGCObjectWidth < cGCMinimumWidth)
            glGCObjectWidth=cGCMinimumWidth;
    }
}

 

 

 

这两行代码是取得长度和宽度的:

1
2
3
var lGCWindowWidth=document.documentElement.scrollWidth;
 
var lGCWindowHeight=document.documentElement.scrollHeight;

 

 

我们在这段代码里加上alert(“1”);时,发现这个1一直弹出来,而data sheet一直在改变,data sheet的长度和宽度一直在增长。原因找到了。

处理方式:

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

代码改为如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
if($.browser.msie && $.browser.version=="6.0"){
  
function GCComputeSizing(GCObject)
{
    alert("new one");
    if (TestGCObject(GCObject))
    {
        var fBIDI=(document.documentElement.currentStyle.direction=="rtl");
        var lGCWindowWidth=document.documentElement.scrollWidth>document.documentElement.clientWidth?document.documentElement.clientWidth:document.documentElement.scrollWidth;
        var lGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.documentElement.scrollHeight;
        var lGCObjectOffsetLeft=0;
        var lGCObjectOffsetTop=0;
        if (fBIDI)
            {
            lGCObjectOffsetLeft=-180;
            lGCObjectOffsetTop=120;
            }
        else
            {
            lGCObjectOffsetLeft=32;
            lGCObjectOffsetTop=-2;
            }
        var lGCObjectWalker=GCObject.parentElement;
        while (lGCObjectWalker !=document.body)
        {
            lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
            lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
            lGCObjectWalker=lGCObjectWalker.offsetParent;
            if (fBIDI)
                if (lGCObjectWalker.offsetLeft > 0)
                    break;
        }
        lGCObjectOffsetLeft+=GCObject.parentElement.offsetLeft;
        lGCObjectOffsetTop+=GCObject.parentElement.offsetTop;
        glGCObjectHeight=lGCWindowHeight - lGCObjectOffsetTop;
        if (glGCObjectHeight > lGCWindowHeight)
            glGCObjectHeight=lGCWindowHeight
        if (glGCObjectHeight < cGCMinimumHeight)
            glGCObjectHeight=cGCMinimumHeight;
        if (fBIDI)
            {
            glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
            }
        else
            glGCObjectWidth=lGCWindowWidth - lGCObjectOffsetLeft;
        if (glGCObjectWidth > lGCWindowWidth)
                glGCObjectWidth=lGCWindowWidth;
        if (glGCObjectWidth < cGCMinimumWidth)
            glGCObjectWidth=cGCMinimumWidth;
    }
 }
}

 

 

加上了判断是在IE6下时才运行此方法,把这个方法加在master page 上,它会把core.js的方法给重载掉,再运行就没有问题了。

关键代码:

1
2
var lGCWindowWidth=document.documentElement.scrollWidth>document.documentElement.clientWidth?document.documentElement.clientWidth:document.documentElement.scrollWidth;
var lGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.documentElement.scrollHeight;

当宽度大于浏览器的宽度时,停止计算。

作者:spring yang

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

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

posted @   spring yang  阅读(1437)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示