2010-01-04 16 views
20

Tengo una clase javascript simple.Llamar a un método prototipo de clase por un evento setInterval

Un método de esta clase configura un temporizador utilizando la función setInterval. El método que deseo invocar cada vez que se desencadena el evento se define dentro de la misma clase.

La pregunta es, ¿cómo puedo pasar este método como un parámetro para la función setInterval?

Un intento fue setInterval ('this.showLoading(), 100). Pero no funciona. Este método tiene acceso a las propiedades de clase, por lo que necesito la referencia 'this'.

Este es el código de ejemplo:

function LoadingPicture(Id) 
    { 
     this.imgArray = null; 
     this.currentImg = 0; 
     this.elementId = Id; 
     this.loadingTimer = null; 
    } 


    LoadingPicture.prototype.showLoading = function() 
    { 
     if(this.currentImg == imgArray.length) 
      currentImg = 0; 

     document.getElementById(this.elementId).src = imgArray[this.currentImg++].src; 
    } 


    LoadingPicture.prototype.StartLoading = function() 
    { 
     document.getElementById(this.elementId).style.visibility = "visible"; 
     loadingTimer = setInterval("showLoading()", 100); 
    } 

Respuesta

31

setInterval puede tener una función directamente, no sólo una cadena. https://developer.mozilla.org/en/DOM/window.setInterval

es decir

loadingTimer = setInterval(showLoading, 100); 

Pero, para una óptima compatibilidad del navegador, se debe utilizar un cierre con una referencia explícita:

var t = this; 
loadingTimer = setInterval(function(){t.showLoading();}, 100); 
+1

El último enfoque es el de aplicación más general. +1 – xtofl

+0

Sí, depende ... Creo que el primero funciona en AS3, pero no recuerdo si lo hace entre navegadores en JS. Este último suele ser el más seguro. –

+0

Funcionó como un amuleto – Andres

14
loadingTimer = setInterval("this.showLoading()", 100); 

En primer lugar, no utilice argumentos de cadena de setInterval/Timeout. Es dudoso de la misma manera que usa eval, y de manera similar puede fallar con restricciones de seguridad CSP en el futuro. Así que en lugar:

loadingTimer = setInterval(this.showLoading, 100); 

Sin embargo, como usted dice, esto va a perder la referencia propietario por lo que la función llamada no verá la derecha this. En el futuro (la recién definida ECMAScript quinta edición), usted será capaz de unirse a la función a su propietario con function.bind:

loadingTimer = setInterval(this.showLoading.bind(this), 100); 

y si aplicar function.bind mismo para los navegadores que aún no lo tienen (vea la parte inferior de this answer), puede usar esta sintaxis hoy.

De lo contrario, tendrá que utilizar un cierre explícito, como en el ejemplo del lingüista de computadora que acaba de publicar.

Cuestiones relacionadas