2011-06-25 17 views
7

ho questo semplice esempio qui, che non è sparare in Chrome 11 per me http://jsfiddle.net/G9mJw/ che consiste in un codice molto semplice:HTML5 Drag and Drop OnDragOver non sparare in 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); 

sembra funzionare bene in Safari tuttavia ... in Chrome l'evento dragover non viene chiamato quando il quadrato rosso tocca il punto tratteggiato.

Ho provato a replicare alcuni esempi che attualmente funzionano in chrome ma non funzionano nemmeno per me.

Ho provato a prevenire il comportamento predefinito per vederlo se funzionava, ma non lo ha fatto. ogni aiuto sarebbe molto apprezzato.

grazie

+0

Funziona per me in Chrome 12 (ultima rilasciata). Forse 11 non l'ha ancora supportato? – Halcyon

+0

strano, ho appena provato con 12.0.742.100 e ancora non funziona ... il contatore non aggiunge 1 per ogni evento sparato ... il che significa che non viene sparato. Inoltre è anche più strano dato che http://html5demos.com/drag funziona senza problemi anche su 11. – zanona

risposta

11

Sembra che è necessario impostare alcuni dati per l'elemento trascinabile sull'evento dragstart per l'evento dragover di essere licenziato sulla zona di lancio.

Ho aggiornato lo snippet http://jsfiddle.net/G9mJw/20/ che ora funziona anche in chrome.

e il nuovo codice come segue:

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); 

Inoltre c'è qualche informazione in più su come funziona in: https://developer.mozilla.org/En/DragDrop/Drag_Operations#Drag_Data e Tale dicitura cose come:

Quando si verifica un trascinamento, i dati devono essere associato al trascinamento che identifica ciò che viene trascinato.

che rendono più facile da capire ... sto solo cercando di capire come funziona questo funziona in Safari, senza la necessità di inviare alcuni dati? o forse già invia qualche contenuto come predefinito?

Anche il metodo event.dataTransfer.setData('text/html', null);, curiosamente, non può inviare una stringa vuota come event.dataTransfer.setData('text/html', ''); altrimenti l'evento dragover non verrà inviato.

+2

un addendum interessante, se ti capita di usare jQuery, almeno per me, sembra che l'oggetto evento sia passato al mio trascinamento le funzioni non contengono l'oggetto dataTransfer. Devo passare da '$ ('. Foo'). Live ('dragstart', ...)' a 'elem.addEventListener ('dragstart', ...)' per far funzionare correttamente i miei eventi – Endophage

+2

e se il trascinare l'oggetto non è nemmeno dal tuo browser? (es .: da un altro browser invece?) – ericslaw

+1

@Endophage se si utilizza jQuery, si può infatti aggiungere l'oggetto dataTransfer all'oggetto evento usando 'jQuery.event.props.push (" dataTransfer ");' (vedi "Altro Proprietà "su http://api.jquery.com/category/events/event-object/) – Ben

4

Chrome attualmente supporta solo alcuni tipi di dati: se i dati non hanno un tipo MIME riconosciuto, il trascinamento/rilascio semplicemente non procede. Ciò è molto chiaramente in violazione delle specifiche W3C, e non è un problema in Firefox (a patto che tu fornisca un po 'di dati) o persino Safari (che permetta al trascinamento di procedere indipendentemente dal fatto che i dati siano impostati o meno).

Il cromo bug report è qui: http://code.google.com/p/chromium/issues/detail?id=93514

+0

"text/html" dovrebbe essere ok, no? Non funziona nemmeno per me con quello. Vedi il mio commento per rispondere da zanona. – molecular

+0

Sembra che l'abbiano risolto, se modifico il JSFiddle collegato da quel ticket (http://jsfiddle.net/pimvdb/HU6Mk/10/) e lo ri-eseguo, Chrome permette il trascinamento di "text/html" e altri tipi di contenuto ora. – natevw

0

ho avuto problemi con i tipi MIME.

W3Schools ha una pagina si può sperimentare con: http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop2

Il loro esempio di codice non avrebbe funzionato per me fino a quando ho cambiato getData e setData a "text/html" al posto di "Testo".

sto usando: versione 34.0.1847.116 Ubuntu 14.04 aura (260.972)