2

我使用下面的代码编写代码以在指定的时间间隔内查询 Web 方法。

现在在 this.Poll 函数中我必须做

this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval);

代替

this.tmo = setTimeout(this.Poll(), this.iInterval);

因为 IE 在 setTimeout 之后丢失了 this 指针
所以我必须传递类它的实例名称:

    var objPoll = new cPoll("objPoll");


如何在不将其作为参数传递的情况下获取实例名称?
我想把它拿出来!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Intervall-Test</title>
    <script type="text/javascript" language="javascript">


        function test()
        {
            alert("Test");
            test.tmo = setTimeout(test, 2000);

            test.Clear = function()
            {
                clearTimeout(test.tmo);
            }
        }




        function cPoll(strInstanceName)
        {
            this.strInstanceName = strInstanceName ;
            this.iInterval = 2000;
            this.tmo=null;
            this.cbFunction=null;

            this.Poll = function()
            {
                this.cbFunction();
                this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval);
            }

            this.Start = function(pCallBackFunction, iIntervalParameter)
            {


                if(this.tmo != null)
                    this.Stop();

                if(iIntervalParameter && iIntervalParameter > 0)
                    this.iInterval=iIntervalParameter;

                this.cbFunction=pCallBackFunction;
                if(this.cbFunction!=null)
                    this.Poll();
                else
                    alert("Invalid or no callback function specified");
            }

            this.Stop = function()
            {
                if(this.tmo != null)
                {
                    clearTimeout(this.tmo);
                    this.tmo=null;
                }
            }
        }


        function CallBackFunction()
        {
            alert("PollCallBack");
        }

        // test();
        // test.Clear();


        var objPoll = new cPoll("objPoll");
    </script>
</head>

<body>
<h1>Test</h1>

<input type="Button" value="Start polling" onclick="objPoll.Start(CallBackFunction,3000);" />
<input type="Button" value="Stop polling" onclick="objPoll.Stop();" />
</body>
</html>
4

7 回答 7

2

将 中的括号去掉this.Poll()。您立即调用此函数,而不是在一个时间间隔之后。如果你松开括号,它将传递一个函数,而不是它的结果,setInterval你不会有任何问题。

setTimeout(this.Poll, this.Interval);

否则,您立即调用该函数,并且不再保存this指针,而 IE 只是将其删除。

在固定变体中,this.Poll将保存指向this并且不会被删除的指针。

于 2010-03-17T09:09:27.203 回答
1

我只是想说,这个自我技巧为我节省了很多头发。

我没想过要创建这样的参考。这意味着具有点击事件的动态创建的元素可以调用我的类的正确实例。

于 2010-06-09T17:34:29.670 回答
1

您还可以使用:

IE

var name = findInstanceOf(cPoll);

function findInstanceOf(obj) {
    for (var v in window) {
        try {
            if (window[v] instanceof obj)
                return v;
        } catch(e) { }
    };
    return false;
}

来自http://www.liam-galvin.co.uk/2010/11/24/javascript-find-instance-name-of-an-object/#read

于 2010-11-24T21:26:03.347 回答
0
var self = this;
this.tmo = setTimeout(function(){
     self.Poll();
}, this.iInterval);
于 2010-03-17T09:09:51.403 回答
0

我今天为一个类似的问题提供了答案,我从头开始创建了一个投票类。您可能想自己采用它。为了不重复,这里是一个链接到所述问题的链接:

使用 Ajax 和 Dojo 轮询服务器*

* 尽管有标题,但我的解决方案同时提供了“香草”和 Dojo 风格。

于 2010-03-17T09:24:54.657 回答
0

您可以使用这个方便的小包装器以给定的时间间隔(默认为 1 秒)定期执行一个函数:

function tick(func, interval) {
    return (function() {
        if(func())
            setTimeout(arguments.callee, interval || 1000);
    })();
}

重复该函数,直到它返回 false:

tick(function() {
   if(should stop) return false;
   do stuff
   return true;
});

如果函数是一个方法,如图所示做一个闭包

// inside your object
var me = this;
tick(function() {
   return me.doStuff();
});
于 2010-03-17T11:27:02.600 回答
0

我问了另一个问题,答案在这里:

JavaScript:在 IE 中列出全局变量

遍历全局变量并检查它是否等于“this”。

于 2010-03-17T12:58:14.733 回答