Ismételten this, de egy kis flash-el megkavarva.
Sziasztok!
Adott egy JS osztály, van egy metódusa. Ezt a metódust paraméterként adom egy flash objektumnak, amit swfobject-tel hozok létre, majd amikor szükséges flashből meghívom ExternalInterface.call-al. Ez működik is a lenti kóddal (bár abban koránt sem vagy biztos, hogy az adott példány metódusát hívja), azonban a this már a window-ra mutat amikor a függvény fut. A kérdés, valahogyan megoldható-e, hogy az ExternalInterface-ből hívott callback-eknél, hogy a this-en keresztül az eredeti objetumot érjem el? Persze különösebb hekkelések, eval, meg túl sok kód nélkül?
JS:benFlashben:
■ Adott egy JS osztály, van egy metódusa. Ezt a metódust paraméterként adom egy flash objektumnak, amit swfobject-tel hozok létre, majd amikor szükséges flashből meghívom ExternalInterface.call-al. Ez működik is a lenti kóddal (bár abban koránt sem vagy biztos, hogy az adott példány metódusát hívja), azonban a this már a window-ra mutat amikor a függvény fut. A kérdés, valahogyan megoldható-e, hogy az ExternalInterface-ből hívott callback-eknél, hogy a this-en keresztül az eredeti objetumot érjem el? Persze különösebb hekkelések, eval, meg túl sok kód nélkül?
JS:ben
CJukebox=function() {
var v= {callback:this.onFinishedLoad};
var p= {};
var a = {id: "musicPlayer", name: "musicPlayer"};
swfobject.embedSWF("player.swf",placeholder", "10", "10", "8.0.35.0", "", v, p, a);
}
CJukebox.prototype.onFinshedLoad=function() {
console.log(this);
}
//valahol később:
new CJukebox();
ExternalInterface.call(callback);
függvény
callback
-nek. Ekkor hagyományos függvényként viselkedik. Egy függvény csak akkor viselkedik metódusként, ha akként van meghívva. Azazthis
-nek, akkor add meg azt explicit, vagy add át eleve az objektumot, aminek meg akarod hívni a metódusát, és hívd meg azt a metódusát az átadott objektumnak.Vagy adj meg egy olyan
callback
-et aminek van arról tudomása, mi athis
. További információkért ajánlom, hogy olvasd el a cikkemet a JavaScript függvényekről.A javascripten belüli this
Az ExternalInterface Call metódusa is csak egy String-et vár első paraméterként, ami a hívandó függvény neve.
Ami igazán problémás számomra: Szeretném az javascript objektum létrehozásakor beállítani a flash változókat, és nem szeretném átadni a callback nevét string formájában, mert azt kicsit hekknek érzem, vagy inkább úgy mondom kevésbé szépnek.
Tehát így megoldható a dolog, és a megfelelő objektumot kapom, csak csúnya:
Mivel nem tudjuk a konstruktorban a példány nevét (jukebox), ezért a fentiek az én elgondolásom szerint nem megoldhatóak, de talán itt valaki mond rá valami trükköt, vagy egyszerűen egy jobb megközelítést.
v
swfobject
egyik metódusának. Ha pedig ez így van, akkor létrehozhatsz egy függvényt, ami tud arról, mi a jukebox objektumod, és annak hívja meg a megfelelő metódusát (mondjuk egy closure miatt).Function.prototype.bind
Uhh, nekem ez elég mély így
A lényeg, hogy a Function
Function
objektumok az ECMAScript 5-ben támogatják abind
metódust, amivel beállítható egy függvényen belül athis
változó. Ha pl. MSIE vagy más szörnyedvények nem támogatnák akkor:Poetro: A swfobject
A swfobject metodusának még objektumként(inkább tömbként kéne itt értelmezni nem?) adom át a leendő flash változókat: {callback:callback,msg:'Helló!'}, de ezek flashen belül már különálló változók amik ha jól láttam stringek (typeof ezt mondja). Tehát hogy az swfobject metódusa mit kap az mellékes szerintem, mert a flash saját környezetében minden string lesz.
Olyan objektumot ami ismeri adott jukebox-ot csak példányosítás után tudok csinálni, nekem pedig az fontos, hogy egy jukebox létrehozása egy soros legyen csak paraméterezni kelljen. De azért az eddigiek mentén elgondolkodva lett egy ötletem, és írtam valamit (lásd lentebb).
Karway:
Ez elég érdekes dolog, valami amit nem ismertem eddig és hasznos. De ha jól látom itt is konstruktoron kívül kell megcsinálni dolgokat, ami nem jó, és az esetleges kompatibilitási kérdéseknek is utána kell olvasni még.
Végül a következő megoldással álltam elő:
Mit gondoltok?