удалите слушателя, который имеет анонимную функцию в Actionscript 3

up.addEventListener(MouseEvent.CLICK, 
    function clickFunc(event:MouseEvent):void
    { 
        revealSpinner(event,51.42,1,spinner);
        event.currentTarget.removeEventListener(event.type, arguments.callee);
        autoTimer.stop();
    },
    false, 0, true);
down.addEventListener(MouseEvent.CLICK, 
    function clickFunc(event:MouseEvent):void
    { 
        revealSpinner(event,51.42,-1,spinner);
        event.currentTarget.removeEventListener(event.type, arguments.callee);
        autoTimer.stop();
    },
    false, 0, true);

Вышеупомянутый код добавляет слушателя нескольких MC. Первоначально методы были анонимными, но я назвал их clickFunc () для попытки ссылки их в моем удалять слушателя.

Вот мой удалять код слушателя. Оба из этих отрывков находятся в отдельных функциях. Добавить метод прослушивателя называют перед удалить методом.

up.removeEventListener(MouseEvent.CLICK, clickFunc );
down.removeEventListener(MouseEvent.CLICK, clickFunc);

Как только я публикую фильм, я получаю эту ошибку:

1120: Access of undefined property clickFunc.
10
задан Amarghosh 7 January 2010 в 07:50
поделиться

5 ответов

Это должно сработать... просто удалите имя метода...

 up.addEventListener(MouseEvent.CLICK, 
        function(event:MouseEvent):void
        { 
            revealSpinner(event,51.42,1,spinner);
            event.currentTarget.removeEventListener(event.type, arguments.callee);
            autoTimer.stop();
        },
        false, 0, true);
    down.addEventListener(MouseEvent.CLICK, 
        function(event:MouseEvent):void
        { 
            revealSpinner(event,51.42,-1,spinner);
            event.currentTarget.removeEventListener(event.type, arguments.callee);
            autoTimer.stop();
        },
        false, 0, true);
2
ответ дан 4 December 2019 в 00:25
поделиться

попробуйте:

up.addEventListener(MouseEvent.CLICK, 
    clickFunc = function(event:MouseEvent):void
    { 
        revealSpinner(event,51.42,1,spinner);
        event.currentTarget.removeEventListener(event.type, arguments.callee);
        autoTimer.stop();
    },
    false, 0, true);

down.addEventListener(MouseEvent.CLICK, 
    clickFunc = function(event:MouseEvent):void
    { 
        revealSpinner(event,51.42,-1,spinner);
        event.currentTarget.removeEventListener(event.type, arguments.callee);
        autoTimer.stop();
    },
    false, 0, true);
0
ответ дан 4 December 2019 в 00:25
поделиться

Прежде всего, у вас есть одно и то же имя, используемое дважды ( Clickfunc ), его нельзя выводить, какой из них вы относитесь к вашим вызовам на RemoveEreventListener. Во-вторых, ClickFunc будет доступно только в функции, где он объявлен:

function foo() {
    var clickFunc: Function;
    up.addEventListener(MouseEvent.CLICK, 
        clickFunc = function (event:MouseEvent):void
        { 
            revealSpinner(event,51.42,1,spinner);
            event.currentTarget.removeEventListener(event.type, arguments.callee);
            autoTimer.stop();
        },
        false, 0, true);

    // 'clickFunc' available here, so this is possible:
    up.removeEventListener(MouseEvent.CLICK, clickFunc);
}

function bar() {
    // 'clickFunc' is not available here, so this is not possible:
    up.removeEventListener(MouseEvent.CLICK, clickFunc);
    // 1120: Access of undefined property clickFunc
}

Если вам нужно ссылаться на методы (например, скажем, удаление их из события), они не могут быть Аноним. Если вам нужно ссылаться на них из нескольких методов, то они не должны быть локальными для одного метода (Foo в примере выше). И им нужны разные идентификаторы ( Clickfunc1 и Clickfunc2 , если вы будете). Это мое предложенное решение:

private function addHandlers(): void
{
    up.addEventListener(MouseEvent.CLICK, upClickHandler, false, 0, true);
    down.addEventListener(MouseEvent.CLICK, downClickHandler, false, 0, true);
}

private function removeHandlers(): void
{
    up.removeEventListener(MouseEvent.CLICK, upClickHandler);
    down.removeEventListener(MouseEvent.CLICK, downClickHandler);
}

private function upClickHandler(event:MouseEvent):void
{ 
    revealSpinner(event,51.42,1,spinner);
    event.currentTarget.removeEventListener(event.type, arguments.callee);
    autoTimer.stop();
}

private function downClickHandler(event:MouseEvent):void
{ 
    revealSpinner(event,51.42,-1,spinner);
    event.currentTarget.removeEventListener(event.type, arguments.callee);
    autoTimer.stop();
}

Конечно, если, как и в вашем примере, методы идентичны, вы можете использовать только один:

private function addHandlers(): void
{
    up.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
    down.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
}

private function removeHandlers(): void
{
    up.removeEventListener(MouseEvent.CLICK, clickHandler);
    down.removeEventListener(MouseEvent.CLICK, clickHandler);
}

private function clickHandler(event:MouseEvent):void
{ 
    revealSpinner(event,51.42,-1,spinner);
    event.currentTarget.removeEventListener(event.type, arguments.callee);
    autoTimer.stop();
}
5
ответ дан 4 December 2019 в 00:25
поделиться

есть несколько способов, как это можно сделать. вот первый способ, который, я думаю, то, что вы ищете.

var upAnon:Function;
var downAnon:Function;

up.addEventListener(MouseEvent.CLICK, 
    upAnon = function (event:MouseEvent):void
    { 
        revealSpinner(event,51.42,1,spinner);
        event.currentTarget.removeEventListener(event.type, arguments.callee);
        autoTimer.stop();
    },
    false, 0, true);
down.addEventListener(MouseEvent.CLICK, 
    downAnon = function (event:MouseEvent):void
    { 
        revealSpinner(event,51.42,-1,spinner);
        event.currentTarget.removeEventListener(event.type, arguments.callee);
        autoTimer.stop();
    },
    false, 0, true);

up.removeEventListener(MouseEvent.CLICK, upAnon);
down.removeEventListener(MouseEvent.CLICK, downAnon);

А вот другой способ, который дает тот же желаемый эффект и функциональность, что и первый. Просто он чище и обычно является стандартной практикой.

function upFunction(event.MouseEvent):void {
    revealSpinner(event,51.42,1,spinner);
    event.currentTarget.removeEventListener(event.type, arguments.callee);
    autoTimer.stop();
}
function downFunction(event.MouseEvent):void {
    revealSpinner(event,51.42,-1,spinner);
    event.currentTarget.removeEventListener(event.type, arguments.callee);
    autoTimer.stop();
}

up.addEventListener(MouseEvent.CLICK, upFunction, false, 0, true);
down.addEventListener(MouseEvent.CLICK, downFunction, false, 0, true);

up.removeEventListener(MouseEvent.CLICK, upFunction);
down.removeEventListener(MouseEvent.CLICK, downFunction);

Причина, по которой вы используете первый тип, заключается в том, что если вы создаете eventHandler внутри функции и вам нужно использовать переменные, определенные в этой функции, внутри вашей анонимной функции. Например, здесь я обращаюсь к var countMe внутри анонимной функции и увеличиваю его на mouse_down, и он будет увеличиваться, пока не активируется mouse_up. Таким образом, каждый раз, когда я нажимаю вниз, он будет считать от 0, пока мышь не поднимется, затем начнет сначала.

var anonFunc:Function;

function doThisStuff(event:MouseEvent):void {
    var countMe = 0;

    stage.addEventListener(Event.ENTER_FRAME,
        anonFunc = function (e:Event) {
            countMe++;
            trace(countMe);
        }
    );  
}

function stopCounting(event:MouseEvent):void {
    stage.removeEventListener(Event.ENTER_FRAME, anonFunc);
}

stage.addEventListener(MouseEvent.MOUSE_DOWN, doThisStuff);
stage.addEventListener(MouseEvent.MOUSE_UP, stopCounting);
3
ответ дан 4 December 2019 в 00:25
поделиться

Вы создаете обработчики событий со слабыми ссылками (передавая истину для этого последнего параметра). Как вы, наверное, уже знаете, слабая ссылка не помешает сборщику мусора собрать вашу функцию. Однако, если вы не поддерживаете ссылку на свои обработчики событий за пределами функции, в которой вы их определяете (не похоже на вас), обработчики будут иметь только одну слабую ссылку, чтобы поддерживать их в рабочем состоянии, поэтому, как только сборщик мусора запускается, ваши обработчики все равно ушли. Суть в том, что ваши обработчики событий не выглядят так, как будто они сработают после запуска сборки мусора, поэтому беспокоиться об удалении обработчиков несколько бессмысленно. Они уйдут сами по себе, хотите вы того или нет.

Вам нужно будет поддерживать ссылку на эти обработчики событий в области, которая все еще будет существовать, когда они должны сработать. Как только вы это сделаете, вы сможете использовать эти ссылки для их удаления.

2
ответ дан 4 December 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: