内存基本没有增
在运行到11次的时候,我进行了以下操作:跳转页面进行其他操作(比如添加新闻等操作),IISRESET,重新登陆,清除浏览器COOKIES,历史记录,临时文件等操作,然后回到拖动的界面,操作了1次(加上前面11次,累计也是12次)又是那样(大部分JS(除导航的按钮以外)全部失效)。
昏闷,都不知道是什么问题,无从下手解决!
莫非只有我一个人碰到这种问题??

解决方案 »

  1.   

     沒遇到過   關注ing..
      

  2.   

    TO my_web:
       应该不是变量运行12次不符合要求,没有这个变量,我每次都是重新document.write的页面,而且是同一个页面TO zhucekunnan:
       会不会是AJAX传递大量页面代码时,被浏览器(IE6)缓存了什么,然后溢出导致的错误?
       1.因为在IE7中没有这个错误。
       2.IE6完全关闭后才正常,其他操作(跳转页面进行其他操作(比如添加新闻等操作),IISRESET,重新登陆,清除浏览器COOKIES,历史记录,临时文件等操作),全部是准时12次JS就瘫痪。
       3.当我去除了一个innerHTML=...后能坚持到13次,不过其他地方没有用到innerHTML=...的形式
       4.当我不断的拖动新组件进来时,只能坚持6下,拖拽尺寸、拖动、编辑属性都只能坚持12下(为什么感觉这个问题有点像侦探问题)
          我自己也测试测试(都弄了2天了),这个程序写的繁琐了些   我把AJAX的贴出来看看,有没有问题,怀疑是这段出了问题:var net = new Object();
    net.READY_STATE_UNINITIALIZED = 0;
    net.READY_STATE_LOADING = 1;
    net.READY_STATE_LOADED = 2;
    net.READY_STATE_INTERACTIVE = 3;
    net.READY_STATE_COMPLETE = 4;net.TextLoader = function(url,method,params,contentType,callBack)
    {
    this.url = url;
    this.method = method;
    this.params = params;
    this.contentType = contentType;
    this.callBack = callBack;
    this.isAsync = typeof(this.callBack) == "function";

    this.req = null;
    this.onerror = this.defaultError;
    }net.TextLoader.prototype=
    {
    loadTextDoc:function()
    {
    if (!this.method)
    {
    this.method = "POST";
    }
    if ((!this.contentType && this.method == "POST") || !this.contentType)
    {
    this.contentType = "application/x-www-form-urlencoded";
    }
    if (window.XMLHttpRequest)
    {
    this.req = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
    this.req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (this.req)
    {
    try
    {
    if (this.isAsync)
    {
    var loader = this;
    this.req.onreadystatechange = function()
    {
    loader.onReadyState.call(loader);
    }
    }
    this.req.open(this.method,this.url,this.isAsync);
    if (this.contentType)
    {
    this.req.setRequestHeader("Content-Type",this.contentType);
    }
    this.req.send(this.params);

    if(!this.isAsync)
    {
    var req = this.req;
    if (req.readyState == net.READY_STATE_COMPLETE)
    {
    if (req.status == 200 || req.status == 0)
    {
    if(req.responseXML != null && req.responseXML.xml != null && req.responseXML.xml != '')
    {
    return req.responseXML;
    }
    else
    {
    return req.responseText;
    }

    this.url = null;
    this.method = null;
    this.params = null;
    this.contentType = null;
    this.callBack = null;
    this.isAsync = null;
    this.req = null;
    this.onerror = null;
    net = null;

    CollectGarbage();

    }
    else
    {
    this.onerror.call(this);
    }
    }
    }
    }
    catch(err)
    {
    this.onerror.call(this);
    }
    }
    }, onReadyState:function()
    {
    var req = this.req;
    var ready = req.readyState;
    if (typeof(this.callBack) == "function")
    {
    this.callBack(ready);
    }
    if (ready == net.READY_STATE_COMPLETE)
    {
    var httpStatus = req.status;
    if (httpStatus == 200 || httpStatus == 0)
    {
    if (typeof(this.callBack) == "function")
    {
    this.callBack(req.responseText);
    }

    }
    else
    {
    this.onerror.call(this);
    }
    }
    }, defaultError:function()
    {
    alert("error fetching data!" + "\n\n " + this.req.readyState);
    }
    }
      

  3.   

      经过我昨天进一步的测试,大致发现了问题的所在,现在我写了个类似的简易错误模型,给大家看看,问题出在哪?是不是IE6的BUG?各位有没有碰到这样的问题?  就是点击按钮后,奇数次点击按钮,页面正常,但是不执行document.close,偶数次点击按钮,页面变成2个,执行了document.close。最后当不执行document.close的次数达到 14次(正常范围12-14次)时,脚本就出问题了,失效。(PS:再多按几次按钮,再按刷新,有没有发现更奇怪的事?)。IE7按道理应该没有这个问题(因为我程序在IE7中没有问题,所以这个简易错误模型没有在IE7下测试)。
      再者,当你运行到比如说6次(任意的<14次)时,这个时候你进行“跳转页面进行其他操作,IISRESET,重新登陆,清除浏览器COOKIES,历史记录,临时文件等操作”,然后回到这个页面,这个问题依然是累计的,即你再点8次(14-6),仍旧出错。(除非你关闭IE6,然后次数恢复到14次)
      还有,请测试的时候打开IE的所有脚本调试选项,是在“INTERNET选项”中的“高级”,你会发现IE6并没有报任何错误!而且打开任务管理器,也不存在CPU和内存有大的变化。
      最后,我的项目已经定型了,再做修改很复杂,我每次document.write整个页面是不好改变的,不知道有没有高手指点一下解决这个问题,不胜感激!分4个文件:
    test1.aspx 代码为:
      
    <script language=javascript src=Ajax.js></script>
    <script language=javascript src=abc.js></script>
    <input type=button name=Button value=Button onclick="abc();">
     abc.js 代码为:function abc()
    {
    var loader = new net.TextLoader("test2.aspx","POST",null,null,LoadingDo2);
    loader.loadTextDoc();
    }function LoadingDo2(txt)
    {
    if (typeof(txt) == "string")
    {
    document.write(txt);
                    alert("document能关闭");
    document.close();
    }
    }test2.aspx 代码为:(请在Codebehind中增加以下代码)private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    Response.Write(@"<script language=javascript src=Ajax.js></script><script language=javascript src=abc.js></script><input type=button name=Button value=Button onclick=abc()>");
    }
    Ajax.js  代码为:(怀疑问题不在这段代码中)var   net   =   new   Object(); 
    net.READY_STATE_UNINITIALIZED   =   0; 
    net.READY_STATE_LOADING   =   1; 
    net.READY_STATE_LOADED   =   2; 
    net.READY_STATE_INTERACTIVE   =   3; 
    net.READY_STATE_COMPLETE   =   4; net.TextLoader   =   function(url,method,params,contentType,callBack) 

    this.url   =   url; 
    this.method   =   method; 
    this.params   =   params; 
    this.contentType   =   contentType; 
    this.callBack   =   callBack; 
    this.isAsync   =   typeof(this.callBack)   ==   "function"; this.req   =   null; 
    this.onerror   =   this.defaultError; 
    } net.TextLoader.prototype= 

    loadTextDoc:function() 

    if   (!this.method) 

    this.method   =   "POST"; 

    if   ((!this.contentType   &&   this.method   ==   "POST")   ¦ ¦   !this.contentType) 

    this.contentType   =   "application/x-www-form-urlencoded"; 

    if   (window.XMLHttpRequest) 

    this.req   =   new   XMLHttpRequest(); 

    else   if   (window.ActiveXObject) 

    this.req   =   new   ActiveXObject("Microsoft.XMLHTTP"); 

    if   (this.req) 

    try 

    if   (this.isAsync) 

    var   loader   =   this; 
    this.req.onreadystatechange   =   function() 

    loader.onReadyState.call(loader); 


    this.req.open(this.method,this.url,this.isAsync); 
    if   (this.contentType) 

    this.req.setRequestHeader("Content-Type",this.contentType); 

    this.req.send(this.params); if(!this.isAsync) 

    var   req   =   this.req; 
    if   (req.readyState   ==   net.READY_STATE_COMPLETE) 

    if   (req.status   ==   200   ¦ ¦   req.status   ==   0) 

    if(req.responseXML   !=   null   &&   req.responseXML.xml   !=   null   &&   req.responseXML.xml   !=   '') 

    return   req.responseXML; 

    else 

    return   req.responseText; 
    } this.url   =   null; 
    this.method   =   null; 
    this.params   =   null; 
    this.contentType   =   null; 
    this.callBack   =   null; 
    this.isAsync   =   null; 
    this.req   =   null; 
    this.onerror   =   null; 
    net   =   null; CollectGarbage(); } 
    else 

    this.onerror.call(this); 




    catch(err) 

    this.onerror.call(this); 


    }, onReadyState:function() 

    var   req   =   this.req; 
    var   ready   =   req.readyState; 
    if   (typeof(this.callBack)   ==   "function") 

    this.callBack(ready); 

    if   (ready   ==   net.READY_STATE_COMPLETE) 

    var   httpStatus   =   req.status; 
    if   (httpStatus   ==   200   ¦ ¦   httpStatus   ==   0) 

    if   (typeof(this.callBack)   ==   "function") 

    this.callBack(req.responseText); 
    } } 
    else 

    this.onerror.call(this); 


    }, defaultError:function() 

    alert("error   fetching   data!"   +   "\n\n   "   +   this.req.readyState); 

    }
      

  4.   

    为了方便大家测试,我打成压缩包,放在网上供下载:
    http://www.ch68.net/TestPleaseUseIE6.zip
      

  5.   

    为了方便大家测试,我打成压缩包,放在网上供下载:
    http://www.ch68.net/TestPleaseUseIE6.zip
      

  6.   


    function LoadingDo2(txt)
    {
    if (typeof(txt) == "string")
    {
    document.close();
    alert(document.readyState)
    alert("write")
    document.write("test");
    //这后边的都不执行了,因为被Write掉了
    document.write("test");
    alert("close")
    document.close();
    }
    }
      

  7.   

    Syntaxdocument.write(sText)
    ParameterssText Required. String that specifies the text and HTML tags to write. Return ValueNo return value.ResYou should not use the write or writeln methods on the current document after the document has finished loading unless you first call the open method, which clears the current document's window and erases all variables.
    Note  When document.write or document.writeln is used in an event handler, document.close should also be used.
      

  8.   

    open Method--------------------------------------------------------------------------------This method works in two ways. It opens a document to collect the output of the write and writeln methods. In this case, only the first two parameters, sUrl and sName are used. When values for the additional parameters are specified, this method opens a window in the same way as the window.open method for the window object. What's New for Microsoft® Internet Explorer 6
    As of Internet Explorer 6, the _media value of the sName parameter specifies that this method loads a URL in the Media Bar. SyntaxoNewDoc = document.open(sUrl [, sName] [, sFeatures] [, bReplace])
    ParameterssUrl Required. When opening a new document, sUrl is a String that specifies a Multipurpose Internet Mail Extensions (MIME) type for the document. When opening a new window, sUrl is a String that specifies the URL to render in the new window. If a sUrl is not specified, a new window with about:blank is displayed.text/html Default. Currently the only MIME type supported for this method. 
     
    sName Optional. When opening up a new document, specifying the String replace for sName designates that the new document is to replace the current document in the history list. If the value replace is not specified when opening up a document, a new entry will simply be added to the history list. When opening a window, this is a String that specifies the name of the window. The value of this parameter may be specified as the value of the TARGET attribute for a form or a element. This value will then will define this new window as the place to load a document. replace This value is only used for opening up a new document and specifies that the new document is to replace the current entry in the history list.  
    _blank When opening a window, the sUrl is loaded into a new, unnamed window. 
    _parent When opening a new window, the sUrl is loaded into the current frame's parent. If the frame has no parent, this value acts as the value _self.  
    _search Available in Internet Explorer 5 and later. When opening a window, the sUrl is opened in the browser's search pane.  
    _self When opening a window, the current document is replaced with the specified sUrl . 
    _top sUrl replaces any framesets that may be loaded. If there are no framesets defined, this value acts as the value _self. 
    _media   Available in Internet Explorer 6 and later. The sUrl is loaded in the Media Bar.  
     
    sFeatures Optional. This String is only used when opening a new window and specifies the settings of the window's display features. This parameter is a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following features are supported.channelmode = { yes | no | 1 | 0 } Specifies whether to display the window in theater mode and show the channel band. The default is no. 
    directories = { yes | no | 1 | 0 } Specifies whether to add directory buttons. The default is yes. 
    fullscreen = { yes | no | 1 | 0 } Specifies whether to display the browser in full-screen mode. The default is no. Use full-screen mode carefully. Because this mode hides the browser's title bar and menus, you should always provide a button or other visual clue to help the user close the window. ALT+F4 closes the new window. A window in full-screen mode must also be in theater mode (channelmode).  
    height = number Specifies the height of the window, in pixels. The minimum value is 100. 
    left = number Specifies the left position, in pixels. This value is relative to the upper-left corner of the screen. The value must be greater than or equal to 0.  
    location = { yes | no | 1 | 0 } Specifies whether to display the input field for entering URLs directly into the browser. The default is yes. 
    menubar = { yes | no | 1 | 0 } Specifies whether to display the menu bar. The default is yes. 
    resizable = { yes | no | 1 | 0 } Specifies whether to display resize handles at the corners of the window. The default is yes. 
    scrollbars = { yes | no | 1 | 0 } Specifies whether to display horizontal and vertical scroll bars. The default is yes. 
    status = { yes | no | 1 | 0 } Specifies whether to add a status bar at the bottom of the window. The default is yes. 
    titlebar = { yes | no | 1 | 0 } Specifies whether to display a title bar for the window. This parameter is ignored unless the calling application is an HTML Application or a trusted dialog box. The default is yes. 
    toolbar = { yes | no | 1 | 0 } Specifies whether to display the browser toolbar, making buttons such as Back, Forward, and Stop available. The default is yes. 
    top = number Specifies the top position, in pixels. This value is relative to the upper-left corner of the screen. The value must be greater than or equal to 0.  
    width = number Sets the width of the window, in pixels. The minimum value is 100. 
     
    bReplace Optional. When the sUrl is loaded into the same window, this Boolean parameter specifies whether the sUrl creates a new entry or replaces the current entry in the window's history list. true sUrl replaces the current document in the history list 
    false sUrl creates a new entry in the history list.  
     Return ValueReturns a reference to the new document or window object. Use this reference to access properties and methods of the new document or window.ResWhen a function fired by an event on any object calls the open method, the window.open method is implied. 
    <SCRIPT LANGUAGE="JScript">
    function foo() {
        open('about:blank');}
    </SCRIPT>
    <BODY onclick="foo();">
    Click this page and window.open() is called.
    </BODY>When an event on any object calls the open method, the document.open method is implied. <BUTTON onclick="open('Sample.htm');">
    Click this button and document.open() is called.
    </BUTTON>ExampleThe following example shows how to use the open method to replace the current document with a new document and display the HTML up contained in the variable sMarkup. Hide Example<HTML>
    <HEAD>
    <TITLE>First Document</TITLE>
    <script>
    function replace(){
        var oNewDoc = document.open("text/html", "replace");
        var sMarkup = "<HTML><HEAD><TITLE>New Document</TITLE><BODY>Hello, world</BODY></HTML>";
        oNewDoc.write(sMarkup);
        oNewDoc.close();
    }
    </script>
    </HEAD>
    <BODY>
    <h1>I just want to say</h1><br>
    <!--Button will call the replace function and replace the current page with a new one-->
    <Input type ="button" value = "Finish Sentence" onclick="replace();">
    </BODY>
    </html>
      

  9.   

    依据上边的两段,更改abc.js为
    function abc()
    {
    var loader = new net.TextLoader("GetPageCode.aspx","POST",null,null,"");
    //callback不是函数的时候,ajax.js会进行同步操作(异步执行的时候,你并不处于event handler之中)
    var str=loader.loadTextDoc();
    var doc = document.open("text/html", "replace");
    doc.write(str);
    doc.close();
    }点了40多下button,木有出现问题
      

  10.   

    大侠!非常感谢,问题基本解决了,虽然我之前也找到一个不成熟的解决方案,但是没有你这个好
    AJAX的这种用法我是压根不知道的也无从找到还是懂英文好啊!羡慕!
    以后有问题再问你,呵呵~~~
    再次非常感谢,帮了我很大很大一个忙!
      

  11.   

    关键问题似乎不在于同步异步,而在于调用的线程是否是主线程。试试下面的代码:function abc()
    {
    var loader = new net.TextLoader("GetPageCode.aspx","POST",null,null,LoadingDo2);
        loader.loadTextDoc();
    }function LoadingDo2(txt)
    {
    if (typeof(txt) == "string")
    {
    setTimeout(function() {
    var doc = document.open("text/html", "replace");
    doc.write(txt);
    doc.close();
    }, 0);
    }
    }
      

  12.   

    还有一个很重要的就是document.write要在body.onload之前使用,否则的话,一定要用document.open来新创建一个document对象,然后在新的doc上write。