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>
Foi útil?

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();
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top