Javascript中暂停功能的实现

方法一:使用setTimeOut来实现

==========================================================

<script language="javascript">
/*Javascript中暂停功能的实现
Javascript本身没有暂停功能(sleep不能使用)同时 vbscript也不能使用doEvents,故编写此函数实现此功能。
javascript作为弱对象语言,一个函数也可以作为一个对象使用。
比如:
function Test(){
alert("hellow");
this.NextStep=function(){
  alert("NextStep");
}
}
我们可以这样调用 var myTest=new Test();myTest.NextStep();

我们做暂停的时候可以吧一个函数分为两部分,暂停操作前的不变,把要在暂停后执行的代码放在this.NextStep中。
为了控制暂停和继续,我们需要编写两个函数来分别实现暂停和继续功能。
暂停函数如下:
*/
function Pause(obj,iMinSecond){
    if (window.eventList==null) window.eventList=new Array();
    var ind=-1;
    for (var i=0;i<window.eventList.length;i++){
        if (window.eventList[i]==null) {
            window.eventList[i]=obj;
            ind=i;
            break;
        }
    }
    if (ind==-1){
        ind=window.eventList.length;
        window.eventList[ind]=obj;
    }
    setTimeout("GoOn(" + ind + ")",iMinSecond);
}

/*
该函数把要暂停的函数放到数组window.eventList里,同时通过setTimeout来调用继续函数。
继续函数如下:
*/
function GoOn(ind){
    var obj=window.eventList[ind];
    window.eventList[ind]=null;
    if (obj.NextStep) obj.NextStep();
    else obj();
}
/*
该函数调用被暂停的函数的NextStep方法,如果没有这个方法则重新调用该函数。
函数编写完毕,我们可以作如下册是:
*/
function Test(){
alert("hellow");
Pause(this,1000);//调用暂停函数 
this.NextStep=function(){
  alert("NextStep");
}
}
</script>

----------------------------------------------------------------------------------------------------

以下脚本完成类似功能:

function  checkuserinfo()
  {
      window.setTimeout(checkuses,5000);
      function  checkuses(){
         alert("5秒后我运行");
     }

==============================================================================

方法二:使用函数闭包来实现

===============================================================================

<input type="button" value="继续" onclick='st();'/>
<script>
/*函数*/
function test(x)
{
    alert(x++);
    alert(x++);
    return function()
    {
        alert(x++);
        alert(x++);
    }
}
var st = test(10);
</script>

这是基本形式,最多是多层嵌套问题。

===============================================================================

方法三:正则替换

===============================================================================

<html>
<body>

<button onclick="cont()">continue</button>
</body>
<script>

function aa()
{
    alert("1");
    pause();
    alert("2");
}
aa();

var cont ;

function pause()
{
    window.onerror = function(){return true;};

    var re = /pause(\s|.)*}/;
    var s = pause.caller.toString();
    var r = s.match(re);
    r = r[0];
    var s2 = r.replace(/pause\(\);|}/g,"");

    cont = function() {eval(s2);window.onerror=null;};
    throw new Error();   
}

</script>
</html>

这样不能保存程序暂停时的当前状态...
之所以用闭包是为了保存“调用堆栈”,包括所有全局和局部变量在暂停时的当前值等
用闭包配合正则替换的原理...实现Pause()就比较完美了^^

================================================================================

方法四:闭包+正则替换,有待实现

posted @ 2011-08-16 14:58  大明1986  阅读(3745)  评论(0编辑  收藏  举报