A callback fv nem módosítja a változó értékét? (JS) - solved
Sziasztok.
Egy jqueryvel működő szájtot készítek, viszont egy problémát nem sikerült eddig megoldani.
Hiba: a ModuleMGR contObj tagja a setModule tagfüggvény egyik ágában jól módosul, a másikban nem módosul, sőt ?null? értéket kap.
ModuleMGR: egy olyan osztály, amely a használt modulokat kezeli
contObj: a fenti osztály tagja, ami egy modul objektumát tárolja
A kód lényeges része kiemelve: [pastebin]
A hibás rész a 107. sor környékén található (úgy vélem).
A self és self2 változók a próbálkozásaim szüleménye.
Nagyon hálás lennék, ha valaki segítene megtalálni a hibát.
Kód beágyazva:
■ Egy jqueryvel működő szájtot készítek, viszont egy problémát nem sikerült eddig megoldani.
Hiba: a ModuleMGR contObj tagja a setModule tagfüggvény egyik ágában jól módosul, a másikban nem módosul, sőt ?null? értéket kap.
ModuleMGR: egy olyan osztály, amely a használt modulokat kezeli
contObj: a fenti osztály tagja, ami egy modul objektumát tárolja
A kód lényeges része kiemelve: [pastebin]
A hibás rész a 107. sor környékén található (úgy vélem).
A self és self2 változók a próbálkozásaim szüleménye.
Nagyon hálás lennék, ha valaki segítene megtalálni a hibát.
Kód beágyazva:
var modAliases = new Array();
var modDefault = null;
function initSite($){
(...)
//Site Navigation scripts (DOM)
$('img#logo').click(function(){window.location.hash = 'slideshow';});
$('div#mtile1>div.tilespacer').click(function(){window.location.hash = 'static|about';});
$('div#mtile2>div.tilespacer').click(function(){window.location.hash = 'static|inspiration';});
$('div#mtile3>div.tilespacer').click(function(){window.location.hash = 'static|references';});
$('div#mtile4>div.tilespacer').click(function(){window.location.hash = 'static|selfdevelopment';});
$('div#mtile5>div.tilespacer').click(function(){window.location.hash = 'static|press';});
$('div#mtile6>div.tilespacer').click(function(){window.location.hash = 'static|contact';});
(...)
}
//Slideshow
function C_slideshow(params){
var self = this;
this.getName = function(){return 'slideshow'};
this.destroy = function(fncallback){
$('div#c_lsh').fadeOut(500, function(){
$('img.lslide_ch').attr('class', 'lslide');
$('img.lslide_active').attr('class', 'lslide');
alert("SLIDESHOW DESTROYED");
fncallback();
});
clearInterval(self.shtimer);
}
this.slideshow_shine = function(){
$('img#lshshine').stop();
$('img#lshshine').css('margin-top', 853);
$('img#lshshine').animate({'margin-top': -1200}, 1000);
}
this.nextSlide = function(){
var ac = self.activeslide;
var ne = self.activeslide.next('img.lslide');
if(ne.length == 0){
ne = $('img.lslide').first();
}
ne.attr('class', 'lslide_ch');
self.activeslide.fadeOut(499,function(){
ac.attr('class', 'lslide');
ne.attr('class', 'lslide_active');
ac.fadeIn(0);
});
self.activeslide = ne;
}
this.activeslide = $('img.lslide').first();
this.activeslide.attr('class', 'lslide_active');
this.shtimer = setInterval(this.nextSlide, 5000);
$('div#c_lsh').fadeIn(500, this.slideshow_shine);
}
modAliases['slideshow'] = C_slideshow;
modDefault = C_slideshow;
//Static content
function C_staticcontent(params){
this.failure = function(){window.location = "404.htm";}
this.cid = null;
if(params != null && params.length>0){
this.cid = params[0];
} else this.failure();
this.getName = function(){return 'static'};
this.getcid = function(){return this.cid};
this.destroy = function(fncallback){
alert("STATIC DESTROYED: " + this.cid);
this.cdiv.fadeOut(500, fncallback);
}
this.cdiv = $('div#c_static_'+this.cid);
if(this.cdiv.length == 0) this.failure();
if(this.cdiv.length == 0){
this.cid = 'about';
this.cdiv = $('div#c_static_'+this.cid);
}
this.stdiv = this.cdiv.children('div.stext');
var div_mleft = this.stdiv.css('margin-left');
var div_width = this.stdiv.css('width');
this.stdiv.css('margin-left', div_width).animate({'margin-left': div_mleft});
this.cdiv.fadeIn(500);
}
modAliases['static'] = C_staticcontent;
//Module manager
function ModuleMGR(){
var self = this;
this.if_cc = false;
this.contObj = null;
this.nextModule = null;
this.setModule = function(fn, params){
self.nextModule = fn;
if(!self.if_cc){
if(self.contObj == null){
self.contObj = new self.nextModule(params);
} else {
var self2 = this;
self.contObj.destroy(function(){self2.contObj = self2.nextModule(params); self2.if_cc = false;})
self.if_cc = true;
alert("DEBUG MESSAGE: NOT NULL");
}
}
}
this.hashChange = function(){
var hashparts = window.location.hash.split("|")
var malias = hashparts[0].substr(1);
if(typeof modAliases[malias] == "undefined"){
self.setModule(modDefault, null);
} else {
self.setModule(modAliases[malias], hashparts.slice(1));
}
}
}
var mMGR = new ModuleMGR();
//Nav.Handler
$(window).hashchange(function(m){return m.hashChange;}(mMGR));
initSite(jQuery);
$(window).hashchange();
Off
Re: Off
if(!self.if_cc){
if(!self.if_cc){
CC = Content Change
Ha folyamatban van tartalomváltás, akkor csak a következő megjelenítendő modul konstruktorát váltom (az if elágazáson kívül).
Tartalom váltás alatt pontosan azt értem, amíg a destroy által elindított utolsó animáció lezajlik és callback fv lefut.
127. sor?
Ami nekem elsőre furcsa az a 127. sor. Hiányzik a scope!
Nem lenne sokkal egyszerűbb ,ha:
Link fent
Módosítottam az általad írt megoldásra. Igazából végső kétségbeesésembe írtam ilyen vadságokat. :)
Kérdés (talán newbie): Ha azt írom, hogy:
Az mMGR az a külső mMGR mind a kettőnél?
new?
Bingo
Köszönöm szépen!