[AS3] TextEvent.LINK remplace asfunction

28 novembre 2007 – 18:34

Il est parfois bien pratique d'exécuter une méthode lorsqu'on clique sur lien html dans un champ texte dynamique. En AS 2 on disposait d'asfunction mais comme l'indique le guide de migration as 2 -> as 3 ça n'existe plus.

Replaced by the new event handling model. You now get the same functionality by using the syntax Event: instead of asfunction:. When a user clicks the link, Flash Player dispatches a TextEvent object of type TextEvent.LINK, which your code can listen for with the addEventListener() method. Any text that you decide to include is stored in the event object's text property.

Lorsqu'on fait de l'AS 3 ça parait assez logique comme changement et ce n'est pas plus compliqué à mettre en place.

var champTexte:TextField = new TextField();
champTexte.htmlText = "<a href="event:monLien">Ceci est un lien html dans un TextField dynamique</a>";
champTexte.addEventListener(TextEvent.LINK, clickHandler);
addChild(champTexte);
 
function clickHandler(e:TextEvent):void {
	trace(e.type); // link
	trace(e.text); // monLien
}

Par contre avant on pouvait exécuter directement une fonction alors que maintenant on notifie un évènement à l'écouteur avec pour seul paramètre une string. (TextEvent.text). C'est assez frustrant de pas pouvoir passer directement des objets.

Première solution de base est alors de faire passer une string qui liste les différents paramètres qu'on veut récupérer. Ensuite on "désérialise" la string pour en faire un objet ou éventuellement on peut directement utiliser les valeurs.

var champTexte:TextField = new TextField();
champTexte.htmlText = "<a href="event:param:valeur,param2:valeur2,param3:valeur3">Ceci est un lien html dans un TextField dynamique</a>";
champTexte.addEventListener(TextEvent.LINK, clickHandler);
addChild(champTexte);
 
function clickHandler(e:TextEvent):void {
trace(e.type); // link
trace(e.text); // param:valeur,param2:valeur,param3:valeur3
var obj:Object = new Object();
obj[e.text.split(",")[0].split(":")[0]]=e.text.split(",")[0].split(":")[1]
obj[e.text.split(",")[1].split(":")[0]]=e.text.split(",")[1].split(":")[1]
obj[e.text.split(",")[2].split(":")[0]]=e.text.split(",")[2].split(":")[1]
}

Dans cet exemple je fais la desérialisation à la main mais vous pouvez très bien réaliser une méthode qui s'occupe de vous retournez un objet lorsque vous lui envoyez la string.

Il y a une autre méthode pour ceux qui veulent vraiment passer des objets, ça consiste à réellement créer un objet avec les données, le sérialiser, pour ensuite le désérialiser. Comme avec AMF. Voir cet article de Roger Braunstein

  1. One Response to “[AS3] TextEvent.LINK remplace asfunction”

  2. Arf, je cherche le successeur de asfunction en AS3 dans Google (mots clés : asfunction as3) et bingo !
    Merci Xav ;-)

    By manolo on sept 24, 2008

Post a Comment