Просмотр полной версии : Некорректная отработка drag & drop
Здравствуйте!
У меня следующая проблема:
Есть список объектов (пусть будут "юзеры"). Для этого списка есть функция удаления юзеров путем перетаскивания на кнопку. Для перетаскивания висит событие MOUSE_MOVE. Проблема в том, что слушатель ловит данные последнего юзера в списке (так как неизбежно протаскивается над ним) и его же удаляет. Т.е. тащишь на удаление первого юзера в списке, а удаляется последний.
Проблема решается сменой MOUSE_MOVE на MOUSE_DOWN, Но! У меня на том же объекте висит событие CLICK которое не срабатывает если есть листнер по MOUSE_DOWN, какой-то конфликт возникает непонятный. Хотелось бы спросить как решить проблему одим из путей:
1) вместо CLICK повесить другой листнер (какой?)
2) Что то сделать с MOUSE_MOVE
P.s. пробовал ставить stopImmediatePropagation(), но эффекта нет (или я что-то не так делал)
1) MouseDown - запоминаете на ком - пихаете в _temp, например.
2) MouseMove - если с зажатой кнопкой и таргет совпадает с _temp (или _temp!=null), то пихаете все что нужно в DragSource и работаете с DragManager;
3) _temp = null;
4) Кнопка, на которую тянете, ловит DragEnter, DragDrop и работает с DragSource этих событий.
Вы мне показали как различить наведение мыши и перетаскивание. А у меня нужно различить события клика и перетаскивания.
Я вам предложил использовать ДрагМенеджер, так как у меня создается ощущение, что вы делаете за него работу.
Клик = Даун + Ап на одном объекте, поэтому клика нет.
Запоминайте кого тянете к помойке в локальную переменную, только если она = нулл. Тогда последний элемент будет в обломе.
GBee, спасибо за совет, заработало. Сделал так:
private var tempObj:Object;
......
target.addEventListener(MouseEvent.MOUSE_DOWN, clickFunc);
......
public function clickFunc(e:MouseEvent):void {
if (e.buttonDown == true){
tempObj = e.currentTarget
}
e.currentTarget.addEventListener(MouseEvent.MOUSE_MOVE, dragIt);
e.currentTarget.addEventListener(MouseEvent.MOUSE_UP, clickUp);
}
private function dragIt(e:MouseEvent):void {
if (e.buttonDown == true && tempObj != null){
//манипуляции с DragManager
}
tempObj=null;
e.currentTarget.removeEventListener(MouseEvent.MOUSE_MOVE, dragIt);
e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, clickUp)
}
private function clickUp(e:MouseEvent):void {
//функция для клика
e.currentTarget.removeEventListener(MouseEvent.MOUSE_MOVE, dragIt);
e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, clickUp)
}
На здоровье :о))
Тока еще два замечания - совета:
1) Вы подписываетесь на два события, а потом отписываетесь от одного. Если человек, просто кликнет , останется подпись на драгИт и тп
2) (MouseEvent.MOUSE_UP, clickUp); для системменеджера добавьте, подписку и отписку. Чтобы когда утянули что то за флэшку и бросили там не было глюков
На здоровье :о))
Тока еще два замечания - совета:
1) Вы подписываетесь на два события, а потом отписываетесь от одного. Если человек, просто кликнет , останется подпись на драгИт и тп
2) (MouseEvent.MOUSE_UP, clickUp); для системменеджера добавьте, подписку и отписку. Чтобы когда утянули что то за флэшку и бросили там не было глюков
Спасибо еще раз, про №1 тупанул :) А по поводу №2 можно поподробней?
Я так понимаю в clickFunc добавить
systemManager.addEventListener(MouseEvent.MOUSE_UP, clickUp);
и отписаться вместе с остальными?
Попробовать было бы быстрее ;о)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.