2008-10-28 6 views
4

Un site Web sur lequel je travaille (utilisant AS2 parce qu'il s'agit d'oldschool) a un fichier .swf d'index plus grand qui charge des sous-swfs en utilisant loadMovie("foo1.swf", placeToShowSwf). Il y a foo1.swf à 4, ce qui est stupide car la seule chose qui est différente entre eux est un seul numéro dans l'adresse d'un fichier xml qui lui indique le contenu à charger. Donc je veux réduire ceci à un fichier, avec une fonction simple que le fichier d'index appelle pour charger le fichier xml, comme vu ici.Chargement d'un fichier XML à l'extérieur du fichier swf dans Flash

function setFooNum(i:Number) { 
    fooNum = i; 
    //my_xml = new XML(); edit: this line has since been removed and is kept for historical purposes 
    my_xml.load("foo"+fooNum+".xml"); 
}; 

Toutefois, pour une raison quelconque, le fichier xml ne se chargera pas. Il charge correctement en dehors de la fonction, mais cela ne me fait pas beaucoup de bien. Il change fooNum correctement, mais cela ne me fait rien si le mauvais fichier xml est déjà en train de se charger. Pour autant que je sache, le code se comporte comme si le my_xml.load("foo"+fooNum+".xml") n'était pas là du tout.

Est-ce une sorte de mesure de sécurité que je ne connais pas, et y a-t-il un moyen de contourner le problème?

EDIT Comme plusieurs personnes ont fait remarquer, la ligne my_xml = new XML() était le coupable. Malheureusement, je reçois maintenant une nouvelle erreur passionnante. Lorsque setFooNum(i) est appelé immédiatement après la loadMove() dans le fichier d'index, un trace(fooNum) à l'intérieur des que fooNum est correctement réglée fonction imprime setFooNum(), mais trace(fooNum) à l'intérieur du onLoad() (qui retourne un succès en dépit rien chargement apparemment, btw) montre que fooNum est indéfini! En outre, j'ai fait un bouton dans l'index swf qui appelle setFooNum(3) (à des fins de débogage), qui, pour une raison quelconque, le fait fonctionner correctement. Attendre quelques secondes pour que le fichier se charge semble résoudre le problème, mais c'est une solution incroyablement laide.

Alors, comment puis-je attendre que tout est complètement chargé avant d'appeler setFooNum()?

+0

Fournir toutes les sources que vous mentionnez dans votre édition, il est difficile d'aider sans elle. –

+0

Pouvez-vous publier à quoi ressemble votre onLoad?fooNum n'est pas une variable globale donc à l'intérieur de votre fooNum onLoad ne sera pas reconnu. C'est un problème à portée variable. – milesmeow

+0

Ceci doit être spécifique à AS2? – D3vtr0n

Répondre

1

Vous devriez peut-être vérifier que vous avez l'autorisation appropriée dans crossdomain.xml. Si votre fichier crossdomain est vérolé, aucune de vos demandes ne sera transmise.

http://crossdomainxml.org/

0

Votre fonction crée une nouvelle instance XML à chaque fois, et par conséquent vous devrez définir la fonction onLoad à chaque fois, si vous réutilisez la même instance XML, vous n'aurez pas besoin de redéfinir la fonction, par exemple

 
var iFooNum:Number; 
var oXML:XML = new XML(); 

oXML.onLoad = function (success:Boolean) { 
    if(success) { 
    //Do Something with XML. 
    } 
} 

loadFooNum = function(i:Number) { 
    iFooNum = i; 
    oXML.load("foo" + i + ".xml"); 
} 

Si votre chargement du fichier XML à partir d'un autre domaine, vous aurez besoin d'un fichier crossdomain.xml sur l'autre domaine pour permettre flash pour charger le fichier XML.

+0

onLoad est défini ailleurs. my_xml.load fonctionne quand il n'est pas appelé dans une fonction, mais j'ai besoin de changer le fichier xml chargé, puis le charger. – mgbennet

+0

mais vous créez une nouvelle instance dans votre fonction et, par conséquent, onLoad n'est pas défini. – Ady

+0

Vous avez raison. C'était idiot de ma part. Mais maintenant je reçois une erreur différente. Si j'appelle setFooNum (i) immédiatement après le loadMovie(), le swf obtient l'un de ceux-ci: «Un script entraîne votre ordinateur à fonctionner lentement. erreurs, que je suppose signifie boucle infinie ou accident. Quoi qu'il en soit, mis à jour ma question. – mgbennet

0

En supposant que vous avez défini le hanlder d'événement onLoad pour votre XMLinstance en dehors de la fonction, vous pouvez supprimer la déclaration de l'instance à l'intérieur du corps de la fonction:

function setFooNum(i:Number) { 
    fooNum = i; 
    my_xml.load("foo"+fooNum+".xml"); 
};