Использование цикла For с массивом и addEventListener - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть эта карта, которую я создаю во Flash. Вы нажимаете на состояние, затем вы можете нажать на значок, чтобы просмотреть всплывающую подсказку / всплывающую информацию. Я пытался вместо того, чтобы создавать новые функции и прослушиватели событий для каждой иконки, использовать цикл for ... но все идет не так хорошо. Я давно не касался AS, так что терпите меня :) 1001 *

var ToolTipMC = map.toolTip;
ToolTipMC.alpha = 0;
var places:Array = new Array();

places = [ "map.paulsens", "map.plutonic", "map.jundee", "map.wiluna", "map.darlot", "map.lawers", "map.gwaliaDeeps", "map.sunriseDam", "map.marvelLoch" ];

function enableToolTips( event:MouseEvent ):void {
    ToolTipMC.x = places[ i ].x + 10;
    ToolTipMC.y = places[ i ].y - ( ToolTipMC.height - 9 );
    Tweener.addTween( ToolTipMC, { y: ToolTipMC.y + 5, alpha: 1, transition: "easeInOutExpo", time: 0.3 } );
    ToolTipMC.toolTipTextField.text = "It worked!";
    trace( "Mouse Over" );
}

function disableToolTips( event:MouseEvent ):void {
    Tweener.addTween( ToolTipMC, { alpha: 0, transition: "easeInOutExpo", time: 0.3 } );
    trace( "Mouse Out" );
}

for( var i:uint = 0; i < places.length; i++ ) {
    places[ i ].addEventListener( MouseEvent.MOUSE_OVER, enableToolTips );
    places[ i ].addEventListener( MouseEvent.MOUSE_OUT, disableToolTips );
}

Элементы в массиве являются именами экземпляров, и я использую класс (ы) Tweener.

Следующее выдает ошибку вывода

TypeError: Ошибка # 1006: значение не является функцией

и останавливается на

places[ i ].addEventListener( MouseEvent.MOUSE_OVER, enableToolTips );

Итак, из этого я могу сделать вывод, что у него возникают проблемы с анализом значений массива до прослушивателя событий, но это насколько я понял :) Может ли кто-нибудь помочь мне с моей дилеммой?

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Исходя из ответа viatropos - я полагаю, вы хотите получить доступ к «месту» с помощью всплывающей подсказки, отправившей событие? Вы можете сделать это, используя event.target:

function enableToolTips( event:MouseEvent ):void {
    var place:DisplayObject = DisplayObject(event.target);
    ToolTipMC.x = place.x + 10;
    ToolTipMC.y = place.y - ( ToolTipMC.height - 9 );

    //the rest of your function...
}

(я также предполагаю, что ваши "места" - это видеоклипы, размещенные на сцене - отсюда и приведение к DisplayObject)

1 голос
/ 11 ноября 2009

Я вижу несколько вещей, которые могут вызывать проблему:

  1. Места являются "строками", а не IEventDispatchers
  2. Не уверен, что вы можете запустить цикл for вне функции, попробуйте обернуть его в функцию.

Вот как это может выглядеть.


<code>function addListeners():void {
    for( var i:uint = 0; i < places.length; i++ ) {
        (places[ i ] as IEventDispatcher).addEventListener( MouseEvent.MOUSE_OVER, enableToolTips );
        (places[ i ] as IEventDispatcher).addEventListener( MouseEvent.MOUSE_OUT, disableToolTips );
    }
}</code>

Вам нужно будет преобразовать places в массив IEventDispatchers, может быть, элементы карты или что-то еще, что вы делаете, некоторый DisplayObject.

Надеюсь, это поможет!

...