2

Fondamentalement j'ai cette fonction:AS3: en fonction anonyme externe addEventListener ne fonctionne pas

private function clickURL(url:String):Function{ 
    trace("Function has been instantiated"); 
    return function(event:MouseEvent):void{ 
     trace("Function has been run"); 
     ExternalNavigation.newBrowserWindow(url); 
    } 
} 

Le but de cette fonction est de prendre une url, mettre l'URL dans une autre fonction et de transmettre cette fonction de retour donc je peut simplement taper:

urlButton.addEventListener(MouseEvent.CLICK, clickURL("http://test.com")); 

la fonction cLICKURL retourne la fonction avec le paramètre d'événement de retour à la fonction addEventListener. De cette façon, je précise quelle URL qui sera ouverte lorsque vous appuyez sur le bouton.

est ici la sortie de ce qui se passe lorsque vous l'utilisez:

//Function has been instantiated 

La fonction Internatl ne s'exécuter lorsque vous cliquez sur le bouton. J'ai donc décidé de l'essayer avec un faux événement pour être sûr de ne rien manquer.

var clickTest:Function = clickURL("http://stackoverflow.com"); 
clickTest(new MouseEvent(MouseEvent.CLICK)); 

est ici la sortie:

//Function has been instantiated 
//Function has been run 

Comme vous pouvez le voir, les deux fonctions sont gérées. Quelqu'un at-il une idée de pourquoi cela fonctionne et non avec addEventListener?

Cordialement Z

+0

réponse mis à jour ... greetz – back2dos

+0

Ainsi est-il pas encore de réponse à pourquoi votre exemple ne fonctionne pas? Problème de GC ou quelque chose. Je suis curieux à ce sujet, puisque j'utilise souvent un modèle similaire, même si je n'ai pas rencontré ce problème. – tylermac

Répondre

-1

un problème que je vois est tout de suite que l'URL variable existe uniquement lorsque la fonction est initialisé comme un écouteur, mais pas quand il est déclenché par l'événement de la souris. Donc, il va effectivement recevoir une valeur nulle à l'exécution. (ou lancer une erreur)

Comme vous l'avez démontré, le programme d'écoute est configuré et exécuté comme prévu lorsque l'événement est déclenché, donc si votre bouton ne déclenche pas l'événement correctement, il y a peut-être un problème avec le bouton?

+1

désolé de contredire, mais l'URL de la variable est disponible, lorsque la fonction est appelée, car AS3 prend en charge les fermetures ... vous pouvez en lire plus ici, par exemple: http://www.transcendentaxis.com/dthompson/blog/archives/ 19 .... greetz – back2dos

+0

Pas besoin de m'excuser, je ne savais pas totalement cela. Merci pour le lien! C'est une chose très importante à savoir, cela pourrait causer toutes sortes de maux de tête. Merci encore. –

+0

Cependant, il n'y a rien de mal avec le bouton. Cela fonctionne si j'utilise une fonction de rappel normale. –

1

cela devrait fonctionner sans problème ...

obtenez-vous des traces si vous faites urlButton.addEventListener(MouseEvent.CLICK, trace); et cliquez sur le bouton?

modifier:

Je ne peux pas le reproduire ... voici un code qui fonctionne parfaitement:

package { 
    import flash.display.*; 
    import flash.events.*; 
    public class Main extends Sprite { 
     private var urlButton:Sprite; 
     public function Main():void { 
      this.addChild(this.urlButton = new Sprite()); 
      this.urlButton.graphics.beginFill(0xFF00FF); 
      this.urlButton.graphics.drawRect(0, 0, 200, 50); 
      urlButton.buttonMode = true; 
      urlButton.addEventListener(MouseEvent.CLICK, clickURL("http://test.com")); 
     } 
     private function clickURL(url:String):Function{ 
      trace("Function has been instantiated"); 
      return function(event:MouseEvent):void{ 
       trace("Function has been run"); 
      } 
     }  
    } 
} 

pourrait vous après peut-être/télécharger une configuration minimale, où il ne fonctionne pas ?

greetz

back2dos

+0

[MouseEvent type = "clic" bubbles = true cancelable = faux événementPhase = 3 localX = -7.5 localY = 6,65 stageX = 496 stageY = 435 relatedObject = null ctrlKey = faux altKey = faux shiftKey = faux delta = 0] ce que je reçois quand je le trace. –

+0

Je ne peux pas reproduire l'erreur non plus ... J'ai fait une installation simple et ça marche pour moi. Créer un fichier principal, ajouter une image-objet, ajouter un écouteur mouseevent et copier littéralement la méthode clickURL. Cela fonctionne comme prévu. – goliatone