Firefox and other Mozilla applications support a number of features for handling drag and drop. This allows the user to click and hold the mouse button down over an element, drag it to another location, and release the mouse button to drop the element there. A translucent representation of what is being dragged will follow the mouse pointer during the drag operation. The drop location may be a different application. Web sites, extensions, and XUL applications may make use of this functionality to customize what elements may be dragged and the drag feedback, as well as specify where elements may be dropped.
Drag and Drop Basics
To drag and drop, generally there are few steps to follow:
- Define a draggable target. Specify the draggable attribute as true for the element we would like to drag. For information about this, see The Draggable Attribute.
- Define the data to be dragged, which may be of a number of different formats. For example, textual data containing a string of text being dragged. For information about this, see Drag Data.
- Optionally, define a custom drag feedback image which will appear beside the mouse pointer during the drag operation. If a custom image is not defined, a default image will automatically be generated based on the element where the mouse was pressed down (i.e. the element being dragged). To learn more about drag feedback images, see Setting the Drag Feedback Image.
- Define the drag effects that are allowed. Three such effects are possible:
copyto indicate that the data being dragged will be copied from its present location to the drop location,
moveto indicate that the data being dragged will be moved, and
linkto indicate that some form of relationship or connection will be created between the source and drop locations. During the drag operation, the drag effects may be modified to indicate that certain effects are allowed at certain locations. If allowed, a drop may occur at that location. See Drag Effects for more details.
- Define a drop area. By default, the browser prevents anything from happening when dropping something onto the HTML element. So to make an element a drop area, just stop the browser from doing the default action. That is, register the on "ondragenter" or "ondragover" event. For more infomation, please see Specifying Drop Targets.
- Do something when the drop occurs. You may want to retrieve the data carried by the draggable target and do something accordingly. For more infomation, please see Performing a Drop.
Mozilla and Firefox support a number of features not in the standard drag and drop model. These allow the user to drag multiple items and drag non-string data. For more information, see Dragging and Dropping Multiple Items.
For a list of common data types used for drag and drop, see Recommended Drag Types.
A quick reference is available for the best practice for dragging the following kinds of items:
See DataTransfer for a reference to the DataTransfer object.
A number of events are used which are fired during various stages of the drag and drop operation. Note that only drag events are fired during a drag operation; mouse events such as
mousemove are not. Also note that
dragend are not fired when dragging a file into the browser from the OS.
The dataTransfer property of all drag events holds data about the drag and drop operation.
- Fired on an element when a drag is started. The user is requesting to drag the element where the
dragstartevent is fired. During this event, a listener would set information such as the drag data and image to be associated with the drag. This event is not fired when dragging a file into the browser from the OS. For information about this, see Starting a Drag Operation.
- Fired when the mouse enters an element while a drag is occurring. A listener for this event should indicate whether a drop is allowed over this location. If there are no listeners, or the listeners perform no operations, then a drop is not allowed by default. This is also the event to listen for in order to provide feedback that a drop is allowed, such as displaying a highlight or insertion marker. For information about this, see Specifying Drop Targets.
- This event is fired as the mouse is moving over an element when a drag is occurring. Much of the time, the operation that occurs during a listener will be the same as the dragenter event. For information about this, see Specifying Drop Targets.
- This event is fired when the mouse leaves an element while a drag is occurring. Listeners should remove any highlighting or insertion markers used for drop feedback.
- This event is fired at the source of the drag and is the element where
dragstartwas fired during the drag operation.
dropevent is fired on the element where the drop occurred at the end of the drag operation. A listener would be responsible for retrieving the data being dragged and inserting it at the drop location. This event will only fire if a drop is desired. It will not fire if the user cancelled the drag operation, for example by pressing the Escape key, or if the mouse button was released while the mouse was not over a valid drop target. For information about this, see Performing a Drop.
- The source of the drag will receive a dragend event when the drag operation is complete, whether it was successful or not. This event is not fired when dragging a file into the browser from the OS. For more information about this, see Finishing a Drag.