AS3中dropTarget返回实例而非名称的问题求助
解决Sprite拖放时带Loader的目标名称获取问题
你遇到的核心问题其实是拖放事件实际命中的是Loader实例,而非它的父Sprite,所以拿到的是Loader自动生成的默认实例名(比如instance126),而不是你给父Sprite设置的"Tinta"。下面给你两种可行的解决方案:
方案一:让Loader不拦截鼠标事件
如果你的Loader不需要响应任何鼠标操作,最简单的办法就是把它的mouseEnabled属性设为false,这样鼠标事件会直接穿透到父Sprite上:
// 假设你的Loader是imagineDrag的子元素 yourLoaderInstance.mouseEnabled = false;
设置之后,当你拖放Sprite到imagineDrag上时,dropTarget就会指向imagineDrag本身,你就能正确获取到它的name属性了。
方案二:手动向上遍历找到父Sprite
如果你的Loader需要保留鼠标交互能力,那可以在处理drop事件时,从命中的对象向上遍历显示列表,找到对应的父Sprite:
function handleDrop(event:MouseEvent):void { var targetObj:DisplayObject = event.dropTarget; // 向上查找直到找到Sprite类型的父对象 while (targetObj != null && !(targetObj is Sprite)) { targetObj = targetObj.parent; } if (targetObj is Sprite) { trace("目标名称:", targetObj.name); // 这里就能拿到"Tinta"了 } }
如果你能确定Loader的直接父级就是目标Sprite,也可以直接取parent简化代码:
var dropTargetSprite:Sprite = event.dropTarget.parent as Sprite; trace(dropTargetSprite.name);
本质原因是:Loader作为显示对象,默认会接收鼠标事件,当拖放时,dropTarget会指向视觉上最顶层的显示元素——也就是你的Loader,而它的name没有被手动设置过,所以Flash会自动生成类似instanceXXX的名称。通过上述两种方法,就能让你拿到真正目标Sprite的名称啦。
内容的提问来源于stack exchange,提问作者Paraschiv Sorin
相关产品推荐
相关产品推荐

