2011-06-25 11 views
7

tengo este sencillo ejemplo aquí que no está disparando en Chrome 11 para mí http://jsfiddle.net/G9mJw/ que consiste en un código muy simple:Arrastre HTML5 y soltar ondragover no disparar en Chrome

var dropzone = document.getElementById('dropzone'), 
    draggable = document.getElementById('draggable'); 


function onDragOver(event) { 
    var counter = document.getElementById('counter'); 
    counter.innerText = parseInt(counter.innerText, 10) + 1; 
} 


dropzone.addEventListener('dragover', onDragOver, false); 

Parece que funciona bien en Safari aunque ... en Chrome el evento dragover no se está llamando cuando el cuadrado rojo toca el de puntos.

He intentado reproducir algunos ejemplos que tienen este trabajo actualmente en cromo, pero tampoco me sirve.

He intentado evitar el comportamiento predeterminado para ver si funcionó, pero no fue así. Cualquier ayuda será muy apreciada.

gracias

+0

Me funciona en Chrome 12 (último en libertad). Tal vez 11 no lo apoyan todavía? – Halcyon

+0

raro, lo intenté con 12.0.742.100 y todavía no funciona ... el contador no agrega 1 por cada evento disparado ... lo que significa que no se está disparando. También es más extraño ya que http://html5demos.com/drag funciona sin problemas incluso en 11. – zanona

Respuesta

11

Parece que se necesita para establecer algunos datos al elemento arrastrable sobre el evento para el evento dragstartdragover para ser disparado en la zona de saltos.

He actualizado el fragmento http://jsfiddle.net/G9mJw/20/ que ahora también funciona en Chrome.

y el nuevo código de la siguiente manera:

var dropzone = document.getElementById('dropzone'), 
    draggable = document.getElementById('draggable'); 


function onDragStart(event) { 
    event.dataTransfer.setData('text/html', null); //cannot be empty string 
} 

function onDragOver(event) { 
    var counter = document.getElementById('counter'); 
    counter.innerText = parseInt(counter.innerText, 10) + 1; 
} 

draggable.addEventListener('dragstart', onDragStart, false); 
dropzone.addEventListener('dragover', onDragOver, false); 

También hay un poco de más información acerca de cómo funciona esto en: https://developer.mozilla.org/En/DragDrop/Drag_Operations#Drag_Data y esta mención cosas como:

Cuando se produce una fricción, los datos deben estar asociado con el arrastre que identifica lo que se está arrastrando.

que hacen más fácil de entender ... Estoy tratando de averiguar cómo esto funciona en Safari sin la necesidad de enviar algunos datos? o tal vez ya envíe algún contenido como predeterminado?

También el método event.dataTransfer.setData('text/html', null);, curiosamente no puede enviar una cadena vacía como event.dataTransfer.setData('text/html', '');, de lo contrario, el evento dragover no se enviará.

+2

un apéndice interesante, si está utilizando jQuery, al menos para mí, parece que el objeto de evento pasó a mi arrastre funciones no contiene el objeto dataTransfer. Tengo que cambiar de '$ ('. Foo'). Live ('dragstart', ...)' a 'elem.addEventListener ('dragstart', ...)' para que mis eventos funcionen correctamente – Endophage

+2

¿Qué pasa si el arrastrar objeto ni siquiera es desde su navegador? (es decir, ¿desde otro navegador en su lugar?) – ericslaw

+1

@Endophage si está utilizando jQuery, de hecho puede agregar el objeto dataTransfer al objeto de evento usando 'jQuery.event.props.push (" dataTransfer ");' (consulte "Otro Propiedades "en http://api.jquery.com/category/events/event-object/) – Ben

4

Actualmente, Chrome solo admite algunos tipos de datos: si sus datos no tienen un tipo MIME reconocido, la función de arrastrar/soltar simplemente no continúa. Esto es claramente una violación de la Especificación W3C, y no es un problema en Firefox (siempre que proporcione algún tipo de datos) o incluso Safari (que permite que la acción de arrastre continúe si los datos están configurados o no).

El cromo informe de error es aquí: http://code.google.com/p/chromium/issues/detail?id=93514

+0

"text/html" debería estar bien, ¿no? Tampoco me funciona con eso. Ver mi comentario para responder por zanona. – molecular

+0

Parece que lo arreglaron, si edito el JSFiddle vinculado desde ese ticket (http://jsfiddle.net/pimvdb/HU6Mk/10/) y lo vuelvo a ejecutar, Chrome permite el arrastre de "text/html" y otros tipos de contenido ahora. – natevw

Cuestiones relacionadas