真的很抱歉張貼的東西,是角&強調具體,但我解決了這個問題的方式(HTML5規範,適用於Chrome)應便於觀察。
.directive('documentDragAndDropTrigger', function(){
return{
controller: function($scope, $document){
$scope.drag_and_drop = {};
function set_document_drag_state(state){
$scope.$apply(function(){
if(state){
$document.context.body.classList.add("drag-over");
$scope.drag_and_drop.external_dragging = true;
}
else{
$document.context.body.classList.remove("drag-over");
$scope.drag_and_drop.external_dragging = false;
}
});
}
var drag_enters = [];
function reset_drag(){
drag_enters = [];
set_document_drag_state(false);
}
function drag_enters_push(event){
var element = event.target;
drag_enters.push(element);
set_document_drag_state(true);
}
function drag_leaves_push(event){
var element = event.target;
var position_in_drag_enter = _.find(drag_enters, _.partial(_.isEqual, element));
if(!_.isUndefined(position_in_drag_enter)){
drag_enters.splice(position_in_drag_enter,1);
}
if(_.isEmpty(drag_enters)){
set_document_drag_state(false);
}
}
$document.bind("dragenter",function(event){
console.log("enter", "doc","drag", event);
drag_enters_push(event);
});
$document.bind("dragleave",function(event){
console.log("leave", "doc", "drag", event);
drag_leaves_push(event);
console.log(drag_enters.length);
});
$document.bind("drop",function(event){
reset_drag();
console.log("drop","doc", "drag",event);
});
}
};
})
我用一個列表來表示已引發一拖進入事件的元素。當一個拖曳事件發生時,我找到匹配的拖拽輸入列表中的元素,將它從列表中移除,並且如果結果列表爲空,我知道我已拖拽到文檔/窗口之外。
我需要在發生拖放事件後重置包含拖動元素的列表,或者下一次開始拖動列表時將使用最後一次拖放操作中的元素填充列表。
我只在目前爲止在chrome上測試過。我做到這一點是因爲Firefox和Chrome有不同的HTML5 DND API實現。 (拖放)。
真的希望這可以幫助一些人。
除了下面的答案:我注意到,至少在鉻事件的順序是: ENTER ENTER LEAVE ENTER LEAVE ... LEAVE 如果你繼續計數,這意味着的進入和離開,你將能夠區分初始輸入和內部輸入/輸出序列 PS:抱歉格式化了... – 2011-07-04 12:50:55
你是男人@MartinWawrusch!感謝這 – aceofspades 2017-02-14 21:08:21