zoukankan      html  css  js  c++  java
  • SharePoint 2007运行 Edit In DataSheet 时在IE 6下页面卡死的分析和处理方法

    摘要

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

    原因分析

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

    #main-content-block {
    	margin:0 auto;
    	padding:20px 0 20px 0;
    	100%;
    	text-align:left;
    	* height:65%; 
    	vertical-align:top;
    }

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

    #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代码是:

    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;
    	}
    }

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

    var lGCWindowWidth=document.documentElement.scrollWidth;
    
    var lGCWindowHeight=document.documentElement.scrollHeight;

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

    处理方式:

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

    代码改为如下:

     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的方法给重载掉,再运行就没有问题了。

    关键代码:

    		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/

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

  • 相关阅读:
    postcss-pxtorem
    git命令记录
    伪类和伪元素
    JavaScript设计模式
    每日思考(2020/09/08)
    每日思考(2020/09/03)
    每日思考(2020/09/02)
    每日思考(2020/09/01)
    每日思考(2020/08/31)
    每日思考(2020/08/27)
  • 原文地址:https://www.cnblogs.com/springyangwc/p/2099331.html
Copyright © 2011-2022 走看看