オブジェクトのインスタンス名を取得する方法
-
20-09-2019 - |
質問
以下のコードを使用して、指定された間隔で 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>
解決 7
他のヒント
this.Poll()
に括弧を失います。あなたはいない時間間隔の後、すぐにこの関数を呼び出します。あなたは括弧を失った場合、それは、機能ではなく、その結果を渡しますsetInterval
すると、あなたはすべての問題を持っていません。
setTimeout(this.Poll, this.Interval);
そうしないと、すぐに関数を呼び出すと、何ももうthis
ポインタを保持していない、とIEはそれを削除します。
固定された変形例では、this.Poll
はthis
するポインタを保持し、それが削除されません。
、この自己トリックは私に引っ張って髪ののトンをの保存しています。
私はこのような参照を作成するとは思いませんでした。これは、クリックイベントにして、動的に作成された要素は、私のクラスの正しいインスタンスを呼び出すことができることを意味します。
次のものも使用できます。
つまり
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
var self = this;
this.tmo = setTimeout(function(){
self.Poll();
}, this.iInterval);
私はゼロからのポーリングクラスを作成した同様の質問今日のための答えを提供します。あなたは自分自身でそれを採用することをお勧めします。複製ではないのために、ここでのリンクは言った質問へのリンクです。
Ajaxと道場にしてサーバーをポーリング*
*タイトルにもかかわらず、私の解決策は、「バニラ」と道場スタイルの両方を提供しています。
あなたが与えられた間隔(デフォルトでは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();
});