我使用以下代码编写代码以在指定的时间间隔内查询Web方法。
现在在这。我必须做的功能
this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval);
而不是
this.tmo = setTimeout(this.Poll(), this.iInterval);
因为IE在setTimeout之后丢失了这个指针
所以我必须传递它的实例名称:
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>
答案 0 :(得分:2)
在this.Poll()
中松开括号。您可以立即调用此功能,而不是在一段时间后调用。如果你松开括号,它会将一个函数而不是它的结果传递给setInterval
,你就不会有任何问题。
setTimeout(this.Poll, this.Interval);
否则你立即调用该函数,并且不再有this
指针,IE只是删除它。
在固定变体中,this.Poll
将保留指向this
的指针,并且不会被删除。
答案 1 :(得分:1)
我只是想说,这个自我伎俩为我节省了吨的头发。
我没想过要创建这样的引用。这意味着具有on click事件的动态创建元素可以调用我的类的正确实例。
答案 2 :(得分: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
答案 3 :(得分:0)
var self = this;
this.tmo = setTimeout(function(){
self.Poll();
}, this.iInterval);
答案 4 :(得分:0)
我今天提供了一个类似问题的答案,我从头开始创建一个轮询类。您可能想要自己采用它。为了不重复,这里是链接到所述问题的链接:
Poll the Server with Ajax and Dojo *
*尽管有标题,但我的解决方案同时提供“vanilla”和Dojo样式。
答案 5 :(得分: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();
});
答案 6 :(得分:0)