2011-02-09 1 views
16

У меня есть <div> цель падения, к которой я привязал события «drop» и «dragover». <div> содержит изображение внутри метки привязки (упрощенно: <div><a><img /></a></div>). Дочерние элементы цели, похоже, блокируют события «drop» или «dragover» от запуска. Только когда перетаскиваемый элемент находится над мишенью, но НЕ над его дочерними элементами, оба события запускаются, как ожидалось.Как не допускать, чтобы дочерние элементы мешали событиям перетаскивания и удаления HTML5?

Поведение, которое я хотел бы достичь, заключается в том, что события «dragover» и «drop» запускаются где угодно над целевым <div>, независимо от наличия дочерних элементов.

+0

что произойдет, если приложить события к или ? – derekcohen

+0

В этом случае он работает так, как ожидалось, но мне нужно иметь возможность прикреплять события ко всему контейнеру. Я не вижу причин, почему это не должно работать. –

+1

См. Мой обходной путь для этой проблемы здесь: http://stackoverflow.com/a/15216514/865467 –

ответ

0

Что-то еще должно происходить с вашим кодом. Я издевался до простого примера здесь:

http://jsfiddle.net/M59j6/6/

и вы можете увидеть, что дочерние элементы не мешают события.

+1

Это jQuery DnD, а не HTML5. – mwilcox

+1

А? Я использовал jquery для более короткого кода, но dragover/dragleave/drop являются стандартными событиями HTML5. – dlo

+0

Вы можете видеть ту же проблему, иногда в вашем примере стреляет dargleave при наведении указателя между родительским и дочерним элементами –

1

Перетаскивание & Спецификация падения серьезно испорчена и довольно трудно работать.

Отслеживание дочерних элементов позволяет достичь ожидаемого поведения (дочерних элементов не мешает).

Ниже приведен краткий пример того, как это сделать (с JQuery):

jQuery.fn.dndhover = function(options) { 
    return this.each(function() { 
    var self = jQuery(this); 
    var collection = jQuery(); 

    self.on('dragenter', function(event) { 
     if (collection.size() === 0) { 
     self.trigger('dndHoverStart'); 
     } 

     collection = collection.add(event.target); 
    }); 

    self.on('dragleave', function(event) { 
     collection = collection.not(event.target); 

     if (collection.size() === 0) { 
     self.trigger('dndHoverEnd'); 
     } 
    }); 
    }); 
}; 

jQuery('#my-dropzone').dndhover().on({ 
    'dndHoverStart': function(event) { 
    jQuery('#my-dropzone').addClass('dnd-hover'); 

    event.stopPropagation(); 
    event.preventDefault(); 
    return false; 
    }, 
    'dndHoverEnd': function(event) { 
    jQuery('#my-dropzone').removeClass('dnd-hover'); 

    event.stopPropagation(); 
    event.preventDefault(); 
    return false; 
    } 
}); 

Кредиты: 'dragleave' of parent element fires when dragging over children elements

2

Несколько наклонные к первоначальному вопросу, но я гугл моего пути здесь интересен следующему :

Как мне сделать <img />, который является дочерним элементом <div draggable="true">...</div> контейнера, правильно вести себя в качестве ручки Wi th, который должен переместить этот контейнер?

Простой: <img src="jake.jpg" draggable="false" />

+3

«А» за идею, но это не сработало в Chrome. Я заметил, что перетаскиваемый атрибут почти полностью игнорируется. – mwilcox

1

Вы можете отключить указатель событий в CSS для всех детей.

.targetDiv * { 
    pointer-events: none; 
} 
Смежные вопросы