摘要
在IE 6打开”Edit In Datasheet” 在sharepoint 2007的list页面时,会造成页面卡死的情况,CPU 这时的运行占到50% +以上,但是在IE 8打开时没有问题。
原因分析
造成这个原因时,我们分析,在MasterPage页面,可能是我们写的Js造成的,但是,把所有的JS注释掉后,这个问题依然存在,己是把所有自己写的css 注释掉后,这个问题没有了,然后就是一块代码一块代码的调试,终于找到造成这个问题的代码。如下:
分析原因,改成如下时就可以运行:
就是把定义长度、宽度和内边距的代码去掉,就可以运行了,分析可能是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) |
03 |
if (TestGCObject(GCObject))
|
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;
|
12 |
lGCObjectOffsetLeft=-180;
|
13 |
lGCObjectOffsetTop=120;
|
17 |
lGCObjectOffsetLeft=32;
|
18 |
lGCObjectOffsetTop=-2;
|
20 |
var lGCObjectWalker=GCObject.parentElement;
|
21 |
while (lGCObjectWalker !=document.body)
|
23 |
lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
|
24 |
lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
|
25 |
lGCObjectWalker=lGCObjectWalker.offsetParent;
|
27 |
if (lGCObjectWalker.offsetLeft > 0)
|
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;
|
39 |
glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
|
42 |
glGCObjectWidth=lGCWindowWidth - lGCObjectOffsetLeft;
|
43 |
if (glGCObjectWidth > lGCWindowWidth)
|
44 |
glGCObjectWidth=lGCWindowWidth;
|
45 |
if (glGCObjectWidth < cGCMinimumWidth)
|
46 |
glGCObjectWidth=cGCMinimumWidth;
|
这两行代码是取得长度和宽度的:
1 |
var lGCWindowWidth=document.documentElement.scrollWidth; |
3 |
var lGCWindowHeight=document.documentElement.scrollHeight; |
我们在这段代码里加上alert(“1”);时,发现这个1一直弹出来,而data sheet一直在改变,data sheet的长度和宽度一直在增长。原因找到了。
处理方式:
当data sheet达到IE的适合长度和宽度时,停止计算,从而停止这个方法的运行。
代码改为如下:
01 |
if ($.browser.msie && $.browser.version== "6.0" ){
|
03 |
function GCComputeSizing(GCObject) |
06 |
if (TestGCObject(GCObject))
|
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;
|
15 |
lGCObjectOffsetLeft=-180;
|
16 |
lGCObjectOffsetTop=120;
|
20 |
lGCObjectOffsetLeft=32;
|
21 |
lGCObjectOffsetTop=-2;
|
23 |
var lGCObjectWalker=GCObject.parentElement;
|
24 |
while (lGCObjectWalker !=document.body)
|
26 |
lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
|
27 |
lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
|
28 |
lGCObjectWalker=lGCObjectWalker.offsetParent;
|
30 |
if (lGCObjectWalker.offsetLeft > 0)
|
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;
|
42 |
glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
|
45 |
glGCObjectWidth=lGCWindowWidth - lGCObjectOffsetLeft;
|
46 |
if (glGCObjectWidth > lGCWindowWidth)
|
47 |
glGCObjectWidth=lGCWindowWidth;
|
48 |
if (glGCObjectWidth < cGCMinimumWidth)
|
49 |
glGCObjectWidth=cGCMinimumWidth;
|
加上了判断是在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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。