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

以下を使用することもできます。

すなわち

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

私は別の質問をしました、答えはここにあります:

JavaScript:IEのグローバル変数を一覧表示します

グローバル変数を反復処理し、それが「this」に等しいかどうかを確認します。

于 2010-03-17T12:58:14.733 に答える
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
var self = this;
this.tmo = setTimeout(function(){
     self.Poll();
}, this.iInterval);
于 2010-03-17T09:09:51.403 に答える