I'm working on this drag and drop application with jquery/javascript, and I'm having to use a balance of the two to accomplish what I want.
var drop = document.elementFromPoint($(this).offset().left, $(this).offset().top);
what I'm trying to do with this code here is to get the element that my draggable is trying to be dropped in (is currently hovering over). This, however, will always return my draggable, as opposed to the the table cell (td) underneath it.
Since I know I am looking for a td element, is there a way to set var drop to be something like:
var drop = document.elementFromPoint(x, y, 'td')?
Or is there a better way to go about doing this?
Since document.elementFromPoint returns the topmost element, you'll need to temporarily set your draggable to display:none or pointer-events:none to find elements below it. I've created a gist below that returns a list of all elements at a given point.
try
var elementsArray = KoreSampl.atPoint(x,y,yourTableElement);
or
var elementsArray = KoreSampl.fromEvent(dropEvent, yourTableElement);
then
for(var i=0; i<elementsArray.length; i++) {
   //loop through elementsArray until you find the td you're interested in
}
Using the gist below: https://gist.github.com/2166393
;(function(){
    //test for ie: turn on conditional comments
    var jscript/*@cc_on=@_jscript_version@*/;
    var styleProp = (jscript) ? "display" : "pointerEvents";
    var KoreSampl = function() {};
    KoreSampl.prototype.fromEvent = function(e, lastElement) {
        e = e || window.event; //IE for window.event
        return this.atPoint(e.clientX, e.clientY, lastElement);
    };
    KoreSampl.prototype.atPoint = function(clientX, clientY, lastElement) {
        //support for child iframes
        var d = (lastElement) ? lastElement.ownerDocument : document;
        //the last element in the list
        lastElement = lastElement || d.getElementsByTagName("html")[0];
        var element = d.elementFromPoint(clientX, clientY);
        if(element === lastElement || element.nodeName === "HTML") {
            return [element];
        } else {
            var style= element.style[styleProp];
            element.style[styleProp]="none"; //let us peak at the next layer
            var result = [element].concat(this.atPoint(clientX,clientY,lastElement));
            element.style[styleProp]= style; //restore
            return result;
        }
    };
    window["KoreSampl"] = new KoreSampl();
})(); 
                        If you can dispense with older browsers, the following CSS will work:
Just apply this rule to your to your topmost element that is being dragged.
#dragging {
  pointer-events: none;
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With