Como obter o nome de instância de um objeto
-
20-09-2019 - |
Pergunta
Eu uso o código abaixo para escrever código para consultar um método de web em um intervalo especificado.
agora, no presente.Enquete função que eu tenho que fazer
this.tmo = setTimeout(this.strInstanceName + ".Poll()", this.iInterval);
em vez de
this.tmo = setTimeout(this.Poll(), this.iInterval);
porque o IE perde a este ponteiro após setTimeout
Então, eu tenho que passar a classe é instância de nome:
var objPoll = new cPoll("objPoll");
Como posso obter o nome da instância, sem passá-lo como parâmetro ?
Eu quero tê-lo fora de lá !
<!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>
Solução 7
Fiz outra pergunta, a resposta está aqui:
JavaScript:Lista de variáveis globais no IE
Iterar através de variáveis globais e verificar se ela é igual a "este".
Outras dicas
Perder o parêntese em this.Poll()
. Você chama essa função imediatamente, não após um intervalo de tempo. Se você perder os colchetes, ele passará uma função, não resultado dela, para setInterval
E você não terá nenhum problema.
setTimeout(this.Poll, this.Interval);
Caso contrário, você chama a função imediatamente e nada se mantém this
Ponteiro mais, e ou seja, apenas exclui.
Em variante fixa, this.Poll
vai segurar o ponteiro para this
E não será excluído.
Eu só queria dizer, esse auto -truque me salvou um tonelada de cabelo puxando.
Não pensei em criar uma referência como essa. Isso significa que os elementos criados dinamicamente com os eventos de clique podem chamar a instância correta da minha classe.
Você também pode usar:
ou seja
var name = findInstanceOf(cPoll);
function findInstanceOf(obj) {
for (var v in window) {
try {
if (window[v] instanceof obj)
return v;
} catch(e) { }
};
return false;
}
A partir de 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);
Eu forneci uma resposta para uma pergunta semelhante hoje em que criei uma aula de votação do zero. Você pode querer adotá -lo por si mesmo. Em questão de não duplicar, aqui está um link um link para a referida pergunta:
Enquete o servidor com Ajax e dojo *
* Apesar do título, minha solução oferece estilos "baunilha" e dojo.
Você pode usar este pequeno invólucro útil para executar uma função periodicamente no intervalo determinado (1 segund por padrão):
function tick(func, interval) {
return (function() {
if(func())
setTimeout(arguments.callee, interval || 1000);
})();
}
A função é repetida até retornar falsa:
tick(function() {
if(should stop) return false;
do stuff
return true;
});
Se a função for um método, faça um fechamento como mostrado
// inside your object
var me = this;
tick(function() {
return me.doStuff();
});