![]() |
События остаются после их удаления
вопрос снят.
Вопрос другого плана. Если кнопка подписана на 2 события клика, и одно из событий было удалено, то при нажатии все равно срабатывают оба. Как разрешить срабатывать только тому, которое не было удалено?! ( какой нить там preventDefault ) |
т.е. после removeEventListener обработчик всё равно продолжает срабатывать?
|
stopPropogation()
|
Событие нельзя "удалить". Можно удалить слушатель, если он удален правильно-срабатывать не будет
preventDefault-предотвращает действие "по умолчанию", для ввода текста, например, отменяет ввод текста. stopPropogation() отменяет всплытие. Что точно вам надо? |
Цитата:
Цитата:
|
насколько я понял у тебя обычный баблинг происходит, stopPropogation() в первом листенере пропиши
|
Цитата:
|
Frost47rus - мне кажется Вы Алеша! - или Вася - неважно.
Цитата:
Jewelz - видимо, хотя помоему, я проверял, баблинг выставлен в false. Может не доглядел. Все равно интересно, давай порассуждаем . CLICK , CLICK - c первого сняли. ( тоесть внутренний ) - раз мы его сняли , то причем тут баблинг? - его уже нет. Остался внешний , получается внешний может баблится как наверх так и вниз? - если так, я походу нуб, и учить мат часть мне! Но насколько я помню баблится - вверх. Добавлено через 53 секунды Frost47rus - мне кажется Вы Алеша! - или Вася - неважно. Цитата:
Jewelz - видимо, хотя помоему, я проверял, баблинг выставлен в false. Может не доглядел. Все равно интересно, давай порассуждаем . CLICK , CLICK - c первого сняли. ( тоесть внутренний ) - раз мы его сняли , то причем тут баблинг? - его уже нет. Остался внешний , получается внешний может баблится как наверх так и вниз? - если так, я походу нуб, и учить мат часть мне! Но насколько я помню баблится - вверх. |
вообще-то если кнопка дважды подписана на событие клика, и один из обработчиков был удален, то при нажатии срабатывает только тот, что остался
Код AS3:
пример м.б. ? |
Цитата:
листенер на клик у кнопки - один! =) листенер на лэйауте - это листенер на лэйауте, но не на кнопке. и внутренний клик эвент в кнопке всего лишь диспетчит какое-либо событие, как правило такое же. извне - слушатель на одно событие - один. не надо пудрить людям мозги. этот форум будут читать и новички - а вы им мозги запудриваете. Добавлено через 42 минуты Вот вам пример стандартной кнопки. Создаётся такая кнопка в Flash CS ручками послойно из графических ресурсов. Отрисовывается hitArea для каждой, если кнопки разные. Соответственно, имена полей - так же проставляются вручную ( по дефолту - 4 лейбла на 4 кадрах, 1 - для hitArea, 1 - для текстового поля. Вешаются листенеры на такую кнопку как и на обычный SimpleButton. Код AS3:
|
Господа, немедленно сбросьте пылкость речей. На форуме запрещено переходить на личности.
Frost47rus, не надо придумывать свои правила подсчета. Событие одно — MouseEvent.CLICK. Оно не бывает "внутренним" или "внешним". Эти определения можно отнести к слушателям, да. Слушателей может быть сколько угодно, даже у "здравомыслящего" разработчика. Вот чего бы мне никогда не пришло в голову, так это диспатчить "как правило такое же" событие из собственного обработчика кнопки. "Как правило" кнопка подписывается на клик по себе исключительно для собственных целей, "как правило" — отображения своей реакции на клик: анимации или другого визуального эффекта. Можно, конечно, завести для этих целей специальный интерактивный объект, и слушать внутри кнопки клик по этому объекту (хитАреа). Но далеко не всегда это целесообразно, поскольку описанной ТС проблемы вообще-то никогда не существовало, и городить лишние механизмы в кнопке никакого смысла нет (если конечно нет нужды в назначении в качестве хитАреа какого-то внешнего объекта). Так что два Слушателя на одно событие Клик — это вполне нормальная ситуация и не надо делать вид, что собственная подписка кнопки "не считается". |
я всё-таки исходил из мнения, что кнопка как объект и её hitArea как объект - два разных объекта.
то, что вся кнопка целиком может быть как одна hitArea - и вся подписана на событие внутри себя же - лишь частный случай. зачастую приходится работать с кнопками, которые художники рисуют в фш. и кнопка сама по себе будет png с прозрачностью. и если заглянуть в тот же широкоизвестный Interactive PNG - найдём там то же самое - отрисовку hitArea, но попиксельно. Wolsh, а насчёт диспетча - я не понял, что имеется в виду тут: "так это диспатчить "как правило такое же" событие из собственного обработчика кнопки"? А какое же тогда? От самой hitArea передавать тот же? Это будет эвент не от кнопки в таком случае, а от её части и доступа к полям нужного event - получено не будет. |
Непонятно, зачем писать диспатч клика, если он происходит "автоматически", то есть это стандартное поведение InteractiveObject, наследником которого является Ваша кнопка. Проще говоря, она ИТАК продиспатчит клик, зачем это дублировать дополнительно? Чтобы было два диспатча?
Добавлено через 3 минуты Interactive PNG — да, хороший пример внутренней подписки на все возможные мышиные события с целью их проанализировать и решить, диспатчить клик "наружу" или нет. Но тоже весьма частный случай)) |
Wolsh, прочтите, пожалуйста, код, который я написал на первой странице темы.
Этот эвент не дублируется. Эвент "внутри" - относится к hitArea кнопки, т.е. event.target - [object MovieClip]. Новый же эвент - он для внешних слушателей и относится к экземпляру [object MyButton]. Вы, видимо, поторопились с выводами. |
Frost47rus
Код AS3:
Wolsh, Silin - ну тогда давай те я приведу полный код, своей сборки и мы вместе выясним где же я косячу. Вот код любой кнопки Код AS3:
Имеем 2 кнопки. - и + . При определенных условиях нажатия 1й или второй, одна из них блокируется, либо не блокируется ни одна. Смотрим Код AS3:
Код AS3:
Код AS3:
Видно - что кнопка подписана на 2 клика, первый происходит сразу же, второй(логика) по событию от модельки . Я специально унес в комментарии удаление второго слушателя, так было изначально - и при таком подходе мы получали следующее - over , down , disable (!!! сняли клик) , release , over . При подходе 2 ( убрав комментарии , тоесть снимая и второго слушателя ) - over , down , disable ! - все верно. Где же я косячу? |
in4core, вот ты пишешь
Цитата:
а вот минималистичный пример проблемы, который можно просто взять и запустить, был бы в тему, да |
silin - ну вроде как пример довольно минималистичный. Тут даже достраивать ничего не надо. Класс кнопки есть ( показал ) , а кнопки допустим подпишем на
Код AS3:
|
Frost47rus, Ваш клипопреобразователь имеет какое-то отношение к данной теме?
in4core, Вам надо выйти из телепатического транса и почувствовать, как мыслят обычные флэш-обыватели. Хотя бы покажите место, откуда Вы получаете свой изумительный трейс. По какому конкретно событию он происходит. Что Вы делаете с кнопками, отчет. А вот в коде Модели Вам бы самому покопаться — боюсь другим будет лень, даже догадываясь, что причина где-то там.. Добавлено через 2 минуты От Ваших thisов уже глаза щиплет.. |
Wolsh - ненавистник зисов? ) А мне кажется это лучший код-стайл.
Соберу пожалуй седня пример для запуска. |
Код AS3:
Код AS3:
либо пропишите нормальные гетеры-сетеры, либо просто сделайте публичной переменную. Код AS3:
Код AS3:
Код AS3:
это не надо проверять - такое поведение пользователя не приведёт к событию MouseEvent.CLICK - проверьте сами. Код AS3:
а если активация будет во время пребывания мыши над кнопкой? получите кашу. Код AS3:
Код AS3:
Вам стоит сделать свой код более прозрачным и понятным. И путаться не будете. А ещё есть дебагер, где можно поставить брейкпойнт и посмотреть как работает последовательность событий. Код AS3:
Добавлено через 3 минуты Цитата:
|
Цитата:
|
я понимаю, что событие, которое происходит внутри его кнопки - будет видно извне.
но в этом случае - у него не верная логика самого процесса. слушатель вешается и внутри и снаружи - на одно и то же. убирая один - второй - остаётся и никуда не девается. так зачем изначально было мешать в кашу всё вместе, если можно было сделать куда более прозрачно?! он погряз в закутках своего кода, но не хочет его перестраивать. его проблемы? да, его. |
Frost47rus - мне просто смешны ваши заявления. Про геттеры и сеттеры я вообще молчу, это просто угар, вам видимо не вдомек, что геттеры без сеттеров бывают. Про приватные переменные которые обозначаются в конструкторе - дикий лол. , *мышиный эвент хэндлер назван совсем как не хэндлер* - да ну нафиг? че серьезно ? - а надо наверное - mouseClickHandler писать ? - давай досвидания.
Frost47rus - никого не хочу обижать или оскорблять. - но я прекращаю разговор с оппонентом в двух случаях , когда он слишком глуп, либо слишком умен. С вами я прекращаю общение. |
это ещё раз доказывает мои слова. вы второй день в программировании.
я пишу на хаксе, где геттеры без сеттеров ( и наоборот ) могут жить абсолютно спокойно. причина моей записи про ваш геттер - была не в том, что он без сеттера, а в том, что он нафиг не нужен. абсолютно бессмысленный лишний код. ваш код не полный. начиная от "начинки" самой кнопки, заканчивая кучей не логичных проверок. ещё раз повторюсь - вам нужно реструктурировать ваш код. с нормальной структурой таких глупых вопросов не возникло бы, потому что ошибок бы не было. пс: приватные не статические переменные логично прописывать в конструкторе, т.к. они являются частью любого из экземпляров и не будут доступны без создания хотя бы одного, что подразумевает пробег по конструктору. после компиляции разкомпильте свою свфку и посмотрите где все ваши переменные находятся. посмотрели? верно, в конструкторе. "а надо наверное - mouseClickHandler писать ? " не ёрничайте. достаточно было бы Код AS3:
as3 расслабляет для неправильных мыслей. а вы их принимаете за правильные. мыслите сразу верно - и будет счастье. |
Цитата:
Что же касается вызова слушателя, который только что был удален - примера никто так и не увидел. Если есть желание продолжить общение - приведите минимальный пример кода. |
Цитата:
Добавлено через 2 минуты Frost47rus Цитата:
|
Цитата:
и даже исходя из лишнего кода -7 моих лишних символов против десятков лишних строк.. не аргумент в вашу пользу ;) |
В соответствии с рекомендациями, код
Код AS1/AS2:
Код AS1/AS2:
Можно так не считать, но наезжать за это и называть *****кодом точно не следует. Если не верите, могу дать точные ссылки на руководства, где это прямо описано. |
Цитата:
|
Цитата:
Код AS3:
|
AlexLucas - только что было написано что у тебя срабатывал, и после викреференс перестал. Что изменилось?
|
Показалось.
|
Седня соберу пример. А то толку просто от разговор мало.
|
Вложений: 1
вот готов минимальный пример. Можно даже потыкать)
Для cs4Вложение 28575 Можно увидеть, что изначально минус выставлен в disable , когда мы переводим его в disable второй раз, отрабатывает еще и второе событие клика |
Угу. Из-за дизаблинга минуса поменялся порядок подписки и соответственно приоритет.
Установите жесткий приоритет для "внутренней" подписки в enable: Код AS3:
|
Wolsh спасибо, вот и нашли наверное корень зла. Отпишусь по результатам
Добавлено через 7 минут Проверил работает. Но как сам считаешь , это все же костыль или нормальная практика? Просто никогда не приходилось работать с приоритетами |
Две подписки на одно событие. Какой-то обработчик должен быть вызван первым, а другой — вторым. Если не задать приоритет явно, первым будет вызван тот, который был подписан раньше. Поскольку ситуация изменения приоритета не всегда очевидна, могут возникать вот такие казусы. Но здесь нет мистики, бага и т.п. Все законно))
|
Зачем тут приоритеты? e.stopImmediatePropagation(); в конец функции test добавь и все.
PS: Заодно и бесполезное условие Код AS3:
Точнее, в ветку if (j == 1) добавляй вызов |
Simplifier ))) это не код. это демонстарция работы приоритетов ) я бы такой код не написал)))
|
| Часовой пояс GMT +4, время: 01:47. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.