Desidero sovrapporre un div al viewport quando l'utente trascina un file nella finestra.Eventi di propagazione, sovrapposizione e trascinamento della selezione
Tuttavia, ho problemi con la propagazione dell'evento. Quando imposto l'overlay su display: block
, sembra che venga generato un evento dragleave
e poi un altro dragenter
e quindi un altro dragleave
di nuovo, quindi è sempre in stato post-trascinamento. Chiaramente chiamo e.stopPropagation()
e e.preventDefault()
sull'oggetto evento, ma non sembra fare la differenza.
L'uscita console.log() quando si trascina qualcosa sulla finestra:
dragenter
dragenter
dragleave
dragenter
dragleave
il CSS. #overlay
è impostato su display: none
di default, ma mostrerà se body
ha la classe dragenter
:
body {
position: absolute;
height: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: 0;
padding: 0;
}
#overlay {
position: absolute;
height: auto;
width: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: url(bg.png) repeat-x top right, url(bg.png) repeat-x bottom left, url(bg.png) repeat-y top right, url(bg.p
ng) repeat-y bottom left;
display: none;
}
body.dragenter #overlay {
display: block;
}
Il javascript. Aggiungere la classe 'DragEnter' sul DragEnter e lo rimuove il DragLeave:
$(document).on('dragenter', function (e) {
e.stopPropagation();
e.preventDefault();
console.log('dragenter');
$(document.body).addClass('dragenter');
});
$(document).on('dragleave', function (e) {
e.stopPropagation();
e.preventDefault();
console.log('dragleave';
$(document.body).removeClass('dragenter');
});
il codice HTML:
<body>
<div id="overlay">...</div>
...
</body>
Impressionante, esattamente il problema che cercavo di risolvere da un paio d'ore;) ma per quanto ne so jquery, $ ('*: visible'). Live() deve essere un selettore piuttosto costoso. potrebbe esserci un'altra soluzione? Intendo i ragazzi di imgur.com ovviamente trovato un modo (trascina un file dal tuo finder/explorer sul sito e vedrai) ma non ho potuto decodificare il codice per scoprire come lo hanno fatto :( –
Penso che sia una soluzione piuttosto pesante inoltre, ma è il più semplice che trovo (con limiti di tempo su un progetto di lavoro e tutti). Ho provato anche a guardare il codice imgur e non è qualcosa che volevo approfondire. – twig