--- title: 拖拽 slug: Drag_and_Drop translation_of: Archive/Mozilla/Drag_and_drop ---
{{ Next("Drag and Drop JavaScript Wrapper") }}
{{ deprecated_header("gecko1.9.1") }}
这部分描述了怎样实现可以拖拽和拖放到其他对象上的可拖拽对象。
很多用户界面都允许用户在界面内拖拽某些具体的对象(Many user interfaces allow one to drag particular objects around within the interface)。举个例子来说,拖拽一些文件到其他目录下;或者以拖拽一个图标到另一个窗口的方式来打开这个图标所指代的文档。Mozilla 和 XUL 提供一些事件来处理用户试图拖拽对象时的状态。
用户以按住鼠标然后移动鼠标的方式开始拖拽。当用户释放鼠标时,拖拽过程停止。事件处理器可以在拖拽开始时、停止时、还有拖拽过程中间时被调用。
Mozilla 通过拖拽会话(drag session)实现了拖拽。当用户要求拖拽某个可拖拽对象时,开始一个拖拽会话(drag session)。由拖拽会话(drag session)更新鼠标指针的位置,并处理可拖拽对象最后拖放的位置。如果一个对象不可拖拽,则不会开始一个拖拽会话(drag session)。由于用户通常只有一个鼠标,所以同一时刻只有一个拖拽会话(drag session)处于使用状态。
注意,拖拽会话(drag session)可以由Mozilla本身或其他应用创建。Mozilla会转换需要的拖拽数据(will translate the data being dragged as needed)。
下面的列表描述了可以被调用的事件处理器,这些处理器可以绑定在任意元素上。You only need to put values for the handlers where you need to do something when the event occurs.
ondraggesture
; this is the HTML 5 spec name for the event and may be used in HTML or XUL; however, for backward compatibility with older versions of Firefox, you may wish to continue using ondraggesture
in XUL.There are two ways that drag and drop events can be handled. This first involves using the drag and drop XPCOM interfaces directly. The second is to use a JavaScript wrapper object that handles some of this for you. The code for this wrapper can be found in a file named {{ Source("toolkit/content/nsDragAndDrop.js nsDragAndDrop.js") }} which is contained in the widget-toolkit (or global) package.
Two interfaces are used to support drag and drop. The first is a drag service, nsIDragService and the second is the drag session, nsIDragSession.
The nsIDragService is responsible for creating drag sessions when a drag starts, and removing the drag session when the drag is complete. The function invokeDragSession
should be called to start a drag inside an ondraggesture
event handler. Once this function is called, a drag has started.
The function invokeDragSession takes four parameters, as described below:
invokeDragSession(element,transferableArray,region,actions)
event.target
during the event handler.The interface {{ interface("nsIDragService") }} also provides the function getCurrentSession
which can be called from within the drag event handlers to get and modify the state of the drag. The function returns an object that implements {{ interface("nsIDragSession") }}.
The interface nsIDragSession is used to get and set properties of the drag that is currently occuring. The following properties and methods are available:
true
if the element the mouse is currently over can accept the object currently being dragged to be dropped on it. Set the value to false
if it doesn't make sense to drop the object on it. This should be changed in the ondragover
and ondragenter
event handlers.index
, should be the index of the item to return.true
if the data being dragged contains data of the specified flavor.{{ Next("Drag and Drop JavaScript Wrapper") }}