javascript-elementFromPoint выбрать нижний элемент

Я работаю над этим приложением перетаскивания с jquery/javascript, и мне нужно использовать баланс из двух, чтобы выполнить то, что я хочу.

var drop = document.elementFromPoint($(this).offset().left, $(this).offset().top);

то, что я пытаюсь сделать с этим кодом, - это получить элемент, который мой перетаскиваемый пытается сбросить (в настоящее время зависает). Это, однако, всегда будет возвращать мой перетаскиваемый, в отличие от ячейки таблицы (td) под ним.

так как я знаю, что ищу td элемент, есть ли способ установить var drop будет что-то вроде:

var drop = document.elementFromPoint(x, y, 'td')?

или есть лучший способ сделать это?

2 ответов


С document.elementFromPoint возвращает самый верхний элемент, вам нужно будет временно установить перетаскиваемый в display:none или pointer-events:none найти элементы под ним. Я создал gist ниже, который возвращает список всех элементов в данной точке.

попробовать

var elementsArray = KoreSampl.atPoint(x,y,yourTableElement);

или

var elementsArray = KoreSampl.fromEvent(dropEvent, yourTableElement);

затем

for(var i=0; i<elementsArray.length; i++) {
   //loop through elementsArray until you find the td you're interested in

}

используя суть ниже: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();
})(); 

Если вы можете обойтись без старых браузеров, будет работать следующий CSS:

просто примените это правило к вашему самому верхнему элементу, который перетаскивается.

#dragging {
  pointer-events: none;
}