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!