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

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

  • 相关阅读:
    创建ros的程序包--3
    ROS文件系统介绍--2
    安装并配置ROS环境1
    ros-indigo-desktop-full安装到ubuntu14.04
    嵌入式声卡应用分析---18
    linux用户态定时器的使用---19
    tiny4412 linux+qtopia nfs网络文件系统的挂载
    ActiveMQ
    Web.xml配置详解之context-param
    Spring MVC的多视图解析器配置及与Freemarker的集成
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2099593.html
Copyright © 2020-2023  润新知