E' assolutamente normale, il filmato caricato nel movieclip cancella le variabili ad esso associate, compreso il gestore onData. Ci sono diversi trucchi per risolvere il bug, tipo:
codice:
ovieClip.prototype.addProperty("onLoad",
function () {
return MovieClip.onLoadList[this];
},
function (func) {
if (MovieClip.onLoadList == undefined) {
MovieClip.onLoadList = {};
}
MovieClip.onLoadList[this] = func;
}
);
ASSetPropFlags(MovieClip.prototype, "onLoad", 1);
//Test
createEmptyMovieClip("foo", 1);
createEmptyMovieClip("bar", 2);
foo.onLoad = function() {
trace("onLoad " + this + " : " + this._url);
trace(this.createEmptyMovieClip("childMC", 1));
this.onLoad = undefined;
}
bar.onLoad = foo.onLoad;
bar.loadMovie("movie1.swf");
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
MovieClip.prototype.addOnLoadHandler = function(path, func) {
if (MovieClip.__onLoadHandler__ == undefined) {
MovieClip.__onLoadHandler__ = {};
}
MovieClip.__onLoadHandler__[path] = func;
};
ASSetPropFlags(MovieClip, ["addOnLoadHandler"], 1);
//
sol = function (func) { addOnLoadHandler(this, func);};
gol = function () { return MovieClip.__onLoadHandler__[this];};
MovieClip.prototype.addProperty("onLoad", gol, sol);
//
//Test
createEmptyMovieClip("hi", 1);
function doOnLoad() { trace("onLoad " + this + ":" + this._url);}
hi.onLoad = doOnLoad;
hi.loadMovie("m1.swf");
//
// Test 2: Assign onLoad-Handler to clip on timeline
addOnLoadHandler("_level0.test2.test", doOnLoad);
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
MCP = MovieClip.prototype;
MCP.$LoadMovie = MCP.loadMovie;
MCP.loadMovie = function ($url,$method){
var i,o = {};
for (i in this) {o[i] = this[i];}
var v = Math.vRandom(36);
this._parent[v] = function() {
if ($d.m.getBytesLoaded()>4) {
clearInterval($d.i);
var j;
for (j in $d.o) {$d.m[j] = $d.o[j];}
if ($d.m.getBytesLoaded()==$d.m.getBytesTotal()) {$d.m.onload();}
delete this[$d.v];
}
}
var $d = {o:o, m:this.valueOf(), v:v, i:setInterval(this._parent,v,15)};
this._parent[v].$d = $d;
return this.$LoadMovie($url,$method);
}
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Movieclip.prototype.oldLoadMovie=Movieclip.prototype.loadMovie
Movieclip.prototype.loadMovie=function(url,vars){
if(this.onData != undefined && this.onData != null){
this._parent.createEmptyMovieClip("__fixEvents",7777)
this._parent.__fixEvents.theTarget=this
this._parent.__fixEvents.onData=this.onData
if(this.onLoad != undefined && this.onLoad != null){
this._parent.__fixEvents.onLoad=this.onLoad
}
this._parent.__fixEvents.onEnterFrame=function(){
this.oldv=this.v
this.v=this.theTarget.getBytesLoaded()
if(this.v != this.oldv){
this.onData.call(this.theTarget)
}
if(this.v == this.theTarget.getBytesTotal()){
this.theTarget.onData=this.onData
if(this.onLoad != undefined){
this.theTarget.onLoad=this.onLoad
}
this.onLoad.call(this.theTarget)
this.removeMovieClip()
}
}
}
this.oldLoadMovie(url,vars)
}
/// TEST
this.createEmptyMovieClip("tester",1)
tester.onData=function(){
trace("hey")
}
tester.onLoad=function(){
trace("loaded")
}
tester.loadMovie("your.swf")
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Se usi il flash mx 2, ti conviene utilizzare la classe MovieClipLoader..