Tengo un problema con la creación de un objeto Javascript y los métodos de llamada dentro de ese objeto utilizando setTimeout. He intentado varias soluciones, pero siempre durante la segunda parte de mi ciclo el alcance se convierte en el objeto ventana en lugar de en mi objeto personalizado. Advertencia: soy bastante nuevo en javascript.Métodos de llamada a objetos personalizados con setTimeout pierde alcance
mi código:
$(function() {
slide1 = Object.create(slideItem);
slide1.setDivs($('#SpotSlideArea'));
slide1.loc = 'getSpot';
slide2 = Object.create(slideItem);
slide2.setDivs($('#ProgSlideArea'));
slide2.loc = 'getProg';
slide2.slide = 1;
setTimeout('triggerSlide(slide1)', slide1.wait);
setTimeout('triggerSlide(slide2)', slide2.wait);
});
function triggerSlide(slideObject) {
slideObject.changeSlide(slideObject);
}
var slideItem = {
div1: null,
div2: null,
slide: 0,
wait: 15000,
time: 1500,
loc: null,
changeSlide: function(self) {
this.slide ? curDiv = this.div1:curDiv = this.div2;
$(curDiv).load(location.pathname + "/" + this.loc, this.slideGo(self));
},
setDivs: function(div) {
var subDivs = $(div).children();
this.div1 = subDivs[0];
this.div2 = subDivs[1];
},
slideGo: function(self) {
if(this.slide) {
$(this.div2).animate({
marginLeft: "-300px"
}, this.time);
$(this.div1).animate({
marginLeft: "0"
}, this.time);
setTimeout('triggerSlide(self)', this.wait);
} else {
$(this.div1).animate({
marginLeft: "300px"
}, this.time);
$(this.div2).animate({
marginLeft: "0"
}, this.time);
setTimeout('triggerSlide(self)', this.wait);
}
this.slide ? this.slide=0:this.slide=1;
}
}
Mi último intento fue la construcción de la triggerSlide función auxiliar para que pudiera intentar pasar la referencia al objeto a través de mis métodos, pero incluso eso no parece funcionar.
que podría utilizar setInterval y funciona, sin embargo:
- que quieren asegurarse de que la animación se ha completado antes de que el temporizador se reinicia
- no aprendo cómo llegar en torno al tema de esa manera. :)
Por lo general, es mejor evitar el código +1 en cadenas a menos que sea absolutamente necesario. Eso incluye 'new Function ('algún código');', 'setTimeout (" doSomething() ", 0);' y el favorito de todos, 'eval ('some code');'. Los dos primeros de los cuales * nunca * he visto una necesidad, el tercero solo para JSON y las expresiones matemáticas de entrada :-) –
He intentado lo anterior, y funciona para la llamada inicial, pero las llamadas para repetir la acción (las llamadas a setTimeout() en slideGo() todavía no funcionan. Las formateé como las anteriores, pero utilicé esto en lugar de slideItem anterior, es decir, setTimeout (function() {this.changeSlide();}, this.wait); Aparece un error en Firebug de que this.changeSlide() no es una función. Sé desde el principio del método slideGo que 'this' hace referencia a mi slideItem, sin embargo, no aparece cuando ocurre esa segunda llamada a setTimeout. es donde estoy confundido. –
También debo mencionar que traté de agregar eso = esto al principio de mi método slideGo, sin embargo, parece que se agrega en un ámbito global en lugar de solo dentro del método. Tengo varios objetos en el página por lo que hace solo uno de animarlos, activados por cada setTimeout. –