`
xiongmao3
  • 浏览: 42817 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

EXT.DD的drop操作,Target是同group中父子关系的子DropTarget时的处理

    博客分类:
  • Ext
阅读更多
-_-\\ ... 

标题很拗口,,而且JAVAEYE限制长度,, 不知道表述出本意没有,,

还原应用场景先:

    以EXTJS教程中关于DD的示例代码为例子。

    想通过DD,把A区域中的某个item拖放到B区域中,或者是B区域的子区域C中,B、C定义在同一个ddGroup中。定义代码如下:
            dropTarget1 = new Tutorial.dd.MyDropTarget('dd2-B', {
                ddGroup: 'group',
                overClass: 'dd-over'
            });
            dropTarget2 = new Tutorial.dd.MyDropTarget('dd2-C', {
                ddGroup: 'group',
                overClass: 'dd-over'
            });


    把item拖放到B区域(父)中,no问题,示例代码中已经实现了。
    把item拖放到C区域(子)中,问题来啦,notifyDrop方法被调用了2次!!
   
    初步想法是,mouseup事件冒泡啦,C区域(子)响应后,再冒泡到B区域(父),DD的事件处理机制处理了两次drop。

    再次测试 B的子区域多定义N个,重叠位置,notifyDrop方法则被调用N次...

    跟踪代码,通过调用堆栈,定位到 DDCore.js中 Ext.dd.DragDropMgr 对象的 fireEvents方法。相关代码如下:


                for (i in this.ids[sGroup]) {
                    var oDD = this.ids[sGroup][i];
                    if (! this.isTypeOfDD(oDD)) {
                        continue;
                    }

                    if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {
                        if (this.isOverTarget(pt, oDD, this.mode)) {
                            // look for drop interactions
                            if (isDrop) {
                                dropEvts.push( oDD );
                            // look for drag enter and drag over interactions
                            } else {

                                // initial drag over: dragEnter fires
                                if (!oldOvers[oDD.id]) {
                                    enterEvts.push( oDD );
                                // subsequent drag overs: dragOver fires
                                } else {
                                    overEvts.push( oDD );
                                }

                                this.dragOvers[oDD.id] = oDD;
                            }
                        }
                    }
                }
。。。
                // fire drop events
                for (i=0, len=dropEvts.length; i<len; ++i) {
                    dc.b4DragDrop(e, dropEvts[i].id);
                    dc.onDragDrop(e, dropEvts[i].id);
                }
   

Ext 把group中定义的满足的target push 到dropEvts集合中,并循环调用 onDragDrop方法。 onDragDrop方法定义在DragSource.js文件中的Ext.dd.DragSource对象里。相关代码摘录如下:
    /**
     * An empty function by default, but provided so that you can perform a custom action before the dragged
     * item is dragged out of the target without dropping, and optionally cancel the onDragOut.
     * @param {Ext.dd.DragDrop} target The drop target
     * @param {Event} e The event object
     * @param {String} id The id of the dragged element
     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
     */
    beforeDragOut : function(target, e, id){
        return true;
    },
    
    // private
    onDragDrop : function(e, id){
        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
        if(this.beforeDragDrop(target, e, id) !== false){
            if(target.isNotifyTarget){
                if(target.notifyDrop(this, e, this.dragData)){ // valid drop?
                    this.onValidDrop(target, e, id);
                }else{
                    this.onInvalidDrop(target, e, id);
                }
            }else{
                this.onValidDrop(target, e, id);
            }
            
            if(this.afterDragDrop){
                /**
                 * An empty function by default, but provided so that you can perform a custom action
                 * after a valid drag drop has occurred by providing an implementation.
                 * @param {Ext.dd.DragDrop} target The drop target
                 * @param {Event} e The event object
                 * @param {String} id The id of the dropped element
                 * @method afterDragDrop
                 */
                this.afterDragDrop(target, e, id);
            }
        }
        delete this.cachedTarget;
    },

    /**
     * An empty function by default, but provided so that you can perform a custom action before the dragged
     * item is dropped onto the target and optionally cancel the onDragDrop.
     * @param {Ext.dd.DragDrop} target The drop target
     * @param {Event} e The event object
     * @param {String} id The id of the dragged element
     * @return {Boolean} isValid True if the drag drop event is valid, else false to cancel
     */
    beforeDragDrop : function(target, e, id){
        return true;
    },


target.notifyDrop 这里即是EXTJS示例文件中notifyDrop调用的源头,这里beforeDragDrop方法是一个空方法,始终返回true。

分析入参发现,e是event对象,当前fireEvent的对象是C区域(子),ID是遍历前面DropEvts集合依次传入的target的ID,于是决定把判断加在这个方法中以屏蔽B区域(父)对当前事件的响应。代码如下:
Ext.dd.DragSource.prototype.beforeDragDrop = function(target, e, id){

        if(e.getTarget().id == id)
            return true;
        else 
            return false;
}



----------------------------朴实的分割线----------------------------

在这种解决方案中,事件还是冒泡啦,只是通过判断dropEvts中的target是否是fireEvent的target而屏蔽notifyDrop方法的重复调用。

是否有更好的方式处理,希望达人不吝指教。

另,想重载Ext.dd.DargSource的beforeDragDrop方法时,发现这样做报错。。
Ext.extend(Ext.dd.DragSource,{
        beforeDragDrop : function(target, e, id){

        if(target.id==e.getTarget().id && target.id==id)
            return true;
        else 
            return false;
});


也希望达人不吝指教
0
2
分享到:
评论
1 楼 java365 2009-12-06  
看了楼主的问题,不过我属于ExtJS 的新手,对其应用还没达到楼主的水平。
只是我也遇到类似的问题,不过我的问题要更复杂些:
拖动源是一个 According 布局的几个GridPanel ,
而DropTarget 则是一个Panel中包含的一个TabPanel中的EditorGridPanel(可有多个相同Tab)

读了楼主的关于 屏蔽区域(父) 的解决方法,稍有点收获,如果楼主已经有了完备的关于这个议题的解决方法,希望楼主可以在blog中更新出来,我将关注。

相关推荐

    Ext Js权威指南(.zip.001

    Ex4.0共2个压缩包特性,《ext js权威指南》 前 言 第1章 ext js 4开发入门 / 1 1.1 学习ext js必需的基础知识 / 1 1.2 json概述 / 3 1.2.1 认识json / 3 1.2.2 json的结构 / 3 1.2.3 json的例子 / 4 1.2.4 ...

    Extjs 初体验

    3. **Ext.dd.DragSource.xml** - 表示可拖动的源对象,定义了如何开始拖动操作和拖动过程中的一些行为。 4. **Ext.dd.DropZone.xml** - 定义了目标区域,即拖动元素可以放置的地方,设置了接收和处理拖动事件的方法...

    ext自定义树组件

    5. **拖放功能**:如果你需要支持节点的拖放操作,可以启用tree的draggable和droppable配置,并使用Ext.dd.DragSource和Ext.dd.DropTarget来处理拖放事件。 6. **加载与异步**:树组件可以设置为异步加载,通过配置...

    ext的tree两个拖拽例子

    首先,我们要理解EXT JS的拖放功能依赖于`Ext.dd.DragSource`和`Ext.dd.DropTarget`两个核心类。`DragSource`定义了可拖动的对象,而`DropTarget`则定义了可以接收拖动对象的目标区域。在TreePanel中,我们可以为每...

    Ext中拖拽Tree2Grid , 清空表格拖拽失效的解决办法>.<

    同时,我们还需要监听`drop`事件,以便在节点被放下时处理相关逻辑。 ```javascript var grid = Ext.create('Ext.grid.Panel', { ... viewConfig: { enableDrop: true, ddGroup: 'myDDGroup' }, listeners: {...

    ExtJs查看图片控件,并且图片可以拖动例子.docx

    var dropTarget = new Ext.dd.DropTarget(Ext.getBody(), { notifyDrop: function(dd, e, data) { var el = data.ddel; // 更新元素位置 el.setXY([e.getX(), e.getY()]); return true; } }); ``` 这段代码中...

    基于EXT2.0.2表格间数据拖拽

    3. **处理数据交换**:在DropTarget的drop事件中,我们需要解析拖动过来的数据,并更新对应的DataStore。这可能涉及到DataStore的insert、remove或update方法,以及同步到服务器端的逻辑。 4. **视觉反馈**:为了...

    treeGrid目录拖动到formPanel

    在`treeGrid`中实现拖放功能,需要集成`Ext.dd.DragSource`和`Ext.dd.DropTarget`类。`DragSource`负责处理拖动行为的开始和结束,而`DropTarget`定义了可以接受拖动元素的目标区域。在本例中,我们需要配置`...

    Java中的Drag and Drop拖拽技术

    Java中的Drag and Drop拖拽技术是指在Java应用程序中,实现拖拽操作的技术,可以分为初级的D&D和高级的D&D两种方法,存在三个重要的概念:Drag Source、Drop Target和Transferable。 Drag and Drop技术可以应用于...

    Ext拖动实例树和表格全

    根据提供的信息,我们可以深入探讨Ext JS中的拖动功能,特别是针对树(Tree)和表格(Grid)的拖动操作。本文将详细介绍这些概念和技术要点。 ### 一、Ext JS 拖动的基本概念 #### 1.1 拖动源与目标 在Ext JS中,拖动...

    强大的Extjs拖动示例

    在实际开发中,为了使代码更易理解和维护,通常会使用ExtJS的插件系统,如`Ext.ux.dd.DragAndDropManager`,它提供了一种统一的方式来管理和协调拖放操作。通过这种方式,开发者可以避免重复编写拖放逻辑,而专注于...

    Ext拖动实例树和表格全 超实用

    - **拖动源**:当用户选择某个元素后进行拖拽操作时,该元素成为拖动源。为了实现这一过程,需要继承`DragSource`类或其子类`DragZone`,并在创建此类的实例时绑定需要拖动的源对象。默认情况下,所有可拖动的子节点...

    eclipse rcp drag&drop

    在Eclipse RCP应用中,Drag & Drop功能是提升用户体验的重要特性,让用户能够通过简单的鼠标操作移动或复制对象。 拖放(Drag & Drop)在Eclipse RCP中的实现涉及到多个组件和接口,主要包括以下几个关键知识点: ...

    ext2.0中文API(部分)

    EXT 2.0 API 是一个用于构建富互联网应用程序(Rich Internet Applications, RIA)的JavaScript框架,它在前端开发领域中扮演着重要角色。EXT 2.0 提供了一套全面且强大的组件库,使开发者能够创建功能丰富的、交互...

    drag-drop-folder-tree.rar_Tree 菜单_drag drop java_drag-drop-fold

    在IT领域,尤其是在Java开发中,拖放(Drag & Drop)功能是用户界面设计中一个重要的交互元素。本文将深入探讨“drag-drop-folder-tree.rar”这个压缩包所包含的资源,它提供了一个强大的动态树视图,支持节点的拖放...

    Ext实现的拖拽树和表格之间的拖拽

    在DropTarget的`onNodeDrop`事件中,我们可以读取这些数据并执行相应的操作,例如在表格中插入或更新记录。 4. **样式和提示**: 为了提供良好的用户体验,我们需要在拖动过程中显示视觉反馈。这可以通过设置CSS...

    Drag and Drop Component Suite 3.7 (拖放)

    当用户从DropSource组件上拖动数据并释放时,DropTarget会触发特定的事件,例如OnDrop事件,从而处理接收到的数据。 DropSource组件则是发起拖放操作的源对象。它负责捕捉用户的鼠标点击和移动,以及在拖动过程中...

    java swing控件的drag和drop的实现方法

    在实现Drag and Drop功能时,我们需要导入`java.awt.dnd.*`包,这个包包含了所有与拖放操作相关的类和接口。例如,`DragSource`、`DropTarget`、`DragGestureListener`、`DropTargetListener`等。 2. **设置...

    js.rar_拖动 java

    在JavaScript和Java编程中,实现拖放(Drag and Drop)功能是一项常见的需求,尤其是在构建交互式用户界面时。本文将详细讲解如何利用JavaScript和Java来创建一个类似igoogle的可拖动边框效果。 首先,我们要理解...

    react-reactdndReact的拖放功能

    3. **Connectors**:连接器是`react-dnd`内部的机制,它们负责将Drag Source和Drop Target与实际的React组件绑定在一起,确保拖放操作的正确执行。 4. **Monitor**:监控器允许你在拖放操作过程中获取状态信息,如...

Global site tag (gtag.js) - Google Analytics