Operación de arrastrar y colocar en HTML

Adobe AIR 1.0 y posterior

Para arrastrar datos hacia dentro y hacia fuera de una aplicación basada en HTML (o hacia dentro y hacia fuera del HTML visualizado en un HTMLLoader), se pueden utilizar eventos de arrastrar y colocar en HTML. La API de arrastrar y colocar en HTML permite arrastrar hacia y desde elementos DOM en el contenido HTML.

Nota: también se pueden utilizar las API NativeDragEvent y NativeDragManager de AIR mediante la detección de eventos en el objeto HTMLLoader que contiene el contenido HTML. Sin embargo, la API de HTML está mejor integrada con el DOM de HTML y le permite controlar el comportamiento predeterminado.

Comportamiento predeterminado de arrastrar y colocar

El entorno HTML proporciona comportamiento predeterminado para gestos de arrastrar y colocar que implican texto, imágenes y URL. Estos tipos de datos siempre pueden arrastrarse para sacarlos de un elemento si se utiliza el comportamiento predeterminado. Sin embargo, solo se puede arrastrar texto para introducirlo en un elemento y solo a elementos en una región editable de la página. Al arrastrar texto entre o dentro de regiones editables de la página, el comportamiento predeterminado realiza una acción de mover. Al arrastrar texto a una región editable desde una región no editable o desde fuera de la aplicación, el comportamiento predeterminado lleva a cabo una acción de copia.

El comportamiento predeterminado puede suprimirse si controla uno mismo los eventos de arrastrar y colocar. Para anular el comportamiento predeterminado hay que llamar a los métodos preventDefault() de los objetos distribuidos para los eventos de arrastrar y colocar. Luego se pueden introducir datos en el destino y eliminar datos del origen según haga falta para llevar a cabo la acción seleccionada.

La situación predeterminada es que el usuario puede seleccionar y arrastrar cualquier texto, así como arrastrar imágenes y vínculos. Se puede utilizar la propiedad de CSS WebKit -webkit-user-select para controlar cómo puede seleccionarse cualquier elemento HTML. Por ejemplo, si se define -webkit-user-select en none , el contenido del elemento no será seleccionable y, por lo tanto, no se podrá arrastrar. También se puede utilizar la propiedad de CSS -webkit-user-drag para controlar si se puede arrastrar un elemento en su totalidad. No obstante, el contenido del elemento se trata por separado. De todos modos, el usuario puede arrastrar una parte seleccionada del texto. Para obtener más información, consulte CSS en AIR .

Eventos de arrastrar y colocar en HTML

Los eventos distribuidos por el elemento iniciador desde el que origina una operación de arrastrar son:

Evento

Descripción

dragstart

Se distribuye cuando el usuario inicia el gesto de arrastrar. El controlador de este evento puede impedir la operación de arrastrar, si es preciso, llamando al método preventDefault() del objeto de evento. Para controlar si se pueden copiar, vincular o mover los datos arrastrados, configure la propiedad effectAllowed. El texto, las imágenes y los vínculos seleccionados se colocan en el portapapeles como parte del comportamiento predeterminado, pero se pueden configurar otros datos para el gesto de arrastrar mediante la propiedad dataTransfer del objeto de evento.

drag

Se distribuye de forma continua durante el gesto de arrastrar.

dragend

Se distribuye cuando el usuario suelta el botón del ratón para terminar el gesto de arrastrar.

Los eventos distribuidos por un destino de arrastre son:

Evento

Descripción

dragover

Se distribuye de forma continua mientras el gesto de arrastrar permanece dentro de los límites del elemento. El controlador de este evento debe definir la propiedad dataTransfer.dropEffect para indicar si se producirá una acción de copiar, mover o vincular si el usuario suelta el ratón.

dragenter

Se distribuye cuando el gesto de arrastrar entra en el elemento.

Si cambia alguna propiedad del objeto dataTransfer en un controlador de eventos dragenter, esas modificaciones se verán suprimidas en cuanto se produzca el siguiente evento dragover. Por otro lado, existe un breve retardo entre un evento dragenter y el primer evento dragover que puede hacer que el cursor parpadee si se han definido propiedades distintas. En muchos casos se puede utilizar el mismo controlador para ambos eventos.

dragleave

Se distribuye cuando el gesto de arrastrar sale de los límites del elemento.

drop

Se distribuye cuando el usuario coloca los datos en el elemento. Solo se tiene acceso a los datos arrastrados dentro del controlador de este evento.

El objeto de evento que se distribuye como respuesta a estos eventos es similar a un evento de ratón. Se pueden utilizar propiedades de evento de ratón tales como ( clientX , clientY ) y ( screenX , screenY ) para determinar la posición del ratón.

La propiedad más importante de un objeto de evento drag es dataTransfer , que contiene los datos arrastrados. El objeto dataTransfer en sí tiene los siguientes métodos y propiedades:

Método o propiedad

Descripción

effectAllowed

El efecto admitido por el origen de la operación de arrastrar. Lo habitual es que este valor lo defina el controlador del evento dragstart. Consulte Efectos de arrastrar en HTML .

dropEffect

El efecto elegido por el destino o el usuario. Si se define la propiedad dropEffect en un controlador de eventos dragover o dragenter , AIR actualiza el cursor para mostrar el efecto que se produciría si el usuario soltara el ratón. Si la definición de dropEffect no coincide con uno de los efectos admitidos, no se permite colocar y se presenta el cursor de indisposición . Si usted no ha definido la propiedad dropEffect como respuesta al último evento dragover o dragenter , el usuario podrá elegir entre los efectos admitidos con las teclas modificadoras normales del sistema operativo.

El efecto final lo notifica la propiedad dropEffect del objeto distribuido para dragend . Si el usuario abondona la operación de colocar, soltando el ratón fuera de un destino idóneo, dropEffect se define en none .

types

Un conjunto que contiene las cadenas de tipos MIME para cada formato de datos presente en el objeto dataTransfer .

getData(mimeType)

Obtiene los datos en el formato especificado por el parámetro mimeType .

El método getData() solo puede llamarse como respuesta al evento drop .

setData(mimeType)

Añade datos a dataTransfer en el formato especificado por el parámetro mimeType. Para añadir datos en varios formatos, llame a setData() para cada tipo MIME. Los datos que el comportamiento predeterminado de arrastrar haya colocado en el objeto dataTransfer se eliminan.

El método setData() solo puede llamarse como respuesta al evento dragstart .

clearData(mimeType)

Elimina datos en el formato especificado por el parámetro mimeType .

setDragImage(image, offsetX, offsetY)

Configura una imagen de arrastrar personalizada. El método setDragImage() solo se puede llamar como respuesta al evento dragstart y únicamente cuando un elemento HTML completo se arrastra estableciendo su estilo CSS -webkit-user-drag en element . El parámetro image puede ser un elemento JavaScript o un objeto Image.

Tipos MIME para la operación de arrastrar y colocar en HTML

Los tipos MIME a utilizar con un objeto dataTransfer de un evento de arrastrar y colocar en HTML incluyen:

Formato de datos

Tipo MIME

Texto

"text/plain"

HTML

"text/html"

URL

"text/uri-list"

Mapa de bits

"image/x-vnd.adobe.air.bitmap"

Lista de archivos

"application/x-vnd.adobe.air.file-list"

También se pueden utilizar otras cadenas MIME, incluidas las que define la aplicación. Sin embargo, cabe la posibilidad de que otras aplicaciones no reconozcan o no puedan utilizar los datos transferidos. Es su responsabilidad añadir datos al objeto dataTransfer en el formato previsto.

Importante: solo el código que se ejecute en el entorno limitado de la aplicación tiene acceso a los archivos colocados tras una operación de arrastre. Si se intenta leer o definir una propiedad de un objeto File dentro de un entorno limitado ajeno a la aplicación, se produce un error de seguridad. Para obtener más información, consulte Gestión de la colocación de archivos en entornos limitados de HTML ajenos a la aplicación .

Efectos de arrastrar en HTML

El iniciador del gesto de arrastrar puede limitar los efectos de arrastrar que se admiten mediante la definición de la propiedad dataTransfer.effectAllowed en el controlador del evento dragstart . Se pueden utilizar los siguientes valores de cadenas:

Valor de la cadena

Descripción

"none"

No se admite ninguna operación de arrastrar.

"copy"

Los datos se copiarán en el destino, dejando los originales en su lugar.

"link"

Los datos se compartirán con el destino utilizando un vínculo a los originales.

"move”

Los datos se copiarán en el destino y se eliminarán del lugar original.

"copyLink"

Los datos se pueden copiar o vincular.

"copyMove"

Los datos se pueden copiar o mover.

"linkMove"

Los datos se pueden vincular o mover.

"all"

Los datos se pueden copiar, mover o vincular. All es el efecto predeterminado cuando se impide el comportamiento predeterminado.

El destino del gesto de arrastrar puede definir la propiedad dataTransfer.dropEffect para indicar la acción que se realiza si el usuario finaliza la operación de colocar. Si el efecto de colocar es una de las acciones admitidas, el sistema muestra el cursor de copiar, mover o vincular, según proceda. De lo contrario, el sistema muestra el cursor de indisposición . Si el destino no define ningún efecto de colocar, el usuario puede elegir entre las acciones admitidas con las teclas modificadoras.

Defina el valor dropEffect de los controladores para ambos eventos, dragover y dragenter :

function doDragStart(event) { 
    event.dataTransfer.setData("text/plain","Text to drag"); 
    event.dataTransfer.effectAllowed = "copyMove"; 
} 
 
function doDragOver(event) { 
    event.dataTransfer.dropEffect = "copy"; 
} 
 
function doDragEnter(event) { 
    event.dataTransfer.dropEffect = "copy"; 
}
Nota: si bien conviene siempre definir la propiedad dropEffect en el controlador de dragenter , tenga en cuenta que el siguiente evento dragover restaurará el valor predeterminado de la propiedad. Defina dropEffect como respuesta a ambos eventos.