Я написал модуль перетаскивания под названием drip-drop , который, среди прочего, исправляет это странное поведение.Если вы ищете хороший низкоуровневый модуль перетаскивания, который вы можете использовать в качестве основы для чего-либо (загрузка файла, перетаскивание в приложении, перетаскивание из или на внешние источники), вам следует проверить этомодуль out:
https://github.com/fresheneesz/drip-drop
Вот как вы будете делать то, что вы пытаетесь сделать, в капельном режиме:
$('#drop').each(function(node) {
dripDrop.drop(node, {
enter: function() {
$(node).addClass('red')
},
leave: function() {
$(node).removeClass('red')
}
})
})
$('#drag').each(function(node) {
dripDrop.drag(node, {
start: function(setData) {
setData("text", "test") // if you're gonna do text, just do 'text' so its compatible with IE's awful and restrictive API
return "copy"
},
leave: function() {
$(node).removeClass('red')
}
})
})
Чтобы сделать это безбиблиотека, метод счетчика - это то, что я использовал в дроп-капле, так как в ответе с самым высоким рейтингом пропускаются важные шаги, которые могут привести к поломке всего, кроме первой капли.Вот как это сделать правильно:
var counter = 0;
$('#drop').bind({
dragenter: function(ev) {
ev.preventDefault()
counter++
if(counter === 1) {
$(this).addClass('red')
}
},
dragleave: function() {
counter--
if (counter === 0) {
$(this).removeClass('red');
}
},
drop: function() {
counter = 0 // reset because a dragleave won't happen in this case
}
});