Html5 Drag & Drop Behaviour
Solution 1:
I'm genuinely embarrassed by how easy this one was.
$("*:visible").live('dragenter dragover',function(event){lightdz(event)});
$("#page").live('dragleave dragexit',function(event)
{
if(event.pageX == "0")
dimdz(event);
});
$("*:visible").live('drop',function(event){dimdz(event)});
#page is a page-wide container. If the dragleave event takes the dragged object outside of the browser window, event.pageX will have a value of 0. If it happens anywhere else, it'll have a non-zero value.
Solution 2:
I may be getting overly complex here but I would do something like this:
var draggingFile = false;
var event2;
//elements with the class hotspots are OKvar hotspots = $(".hotspots");
//Handlers on the body for drag start & stop
$("body").live("dragover", function(event){ draggingFile = true; event2 = event; });
$("body").live("dragexit dragleave drop", function(event){ draggingFile = false; event2 = event; });
//Function checks to see if file is being dragged over an OK hotspot regardless of other elements infrontvar isTargetOK = function(x, y){
hotspots.each(function(i, el){
el2 = $(el);
var pos = el2.offset();
if(x => pos.left && x <= pos.left+el2.width() && y => pos.top && y <= post.top+el2.height()){
returntrue;
}
});
returnfalse;
};
//Mousemove handler on body
$("body").mousemove(function(e){
//if user is dragging a fileif(draggingFile){
//Check to see if this is an OK element with mouse X & Yif(isOKTarget(e.pageX, e.pageY)){
//Light em' up!lightdz(event2);
} else { /* Fade em' :( */dimdz(event2); }
} else {
dimdz(); //Having no parematers means just makes sure hotspots are off
}
});
BTW that's probably not going to work straight off the bat, so you'll have to tweak it a bit to work with your code.
Solution 3:
I tried the accepted solution here, but ended up using setTimeout to overcome the issue. I was having a ton of trouble with the page-wide container blocking the drop element if it was floated on top, and still causing the problem if it was the drop element.
<bodystyle="border: 1px solid black;"><divid="d0"style="border: 1px solid black;"> </div><divid="d1"style="border: 1px solid black; display: none; background-color: red;">-> drop here <-</div><divid="d2"style="border: 1px solid black;"> </div><divstyle="float: left;">other element</div><divstyle="float: left;"> - </div><divstyle="float: left;">another element</div><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/></body><scripttype="text/javascript">var resetTimer;
var f = function(e)
{
if (e.type == "dragover")
{
e.stopPropagation();
e.preventDefault();
if (resetTimer)
{
clearTimeout(resetTimer);
}
document.getElementById('d1').style.display = '';
}
else
{
var f = function()
{
document.getElementById('d1').style.display = 'none';
};
resetTimer = window.setTimeout(f, 25);
}
};
document.body.addEventListener("dragover", f, true);
document.body.addEventListener("dragleave", f, true);
document.getElementById('d1').addEventListener("drop", function(e){ f(); alert('dropped'); }, false);
</script>
If you were to just call f();
instead of window.setTimeout(f, 250);
, you'll see some nasty flickering of the element showing and hiding.
http://jsfiddle.net/guYWx/
Post a Comment for "Html5 Drag & Drop Behaviour"