javascript - elementFromPoint选择底部元素

Jor*_*man 9 javascript jquery jquery-ui

我正在使用jquery/javascript处理这个拖放应用程序,我必须使用两者之间的平衡来完成我想要的.

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

这里我想用这个代码做的是获取我的draggable试图被丢弃的元素(目前正在盘旋).但是,这将始终返回我的draggable,而不是td它下面的table cell().

因为我知道我在寻找一个td元素,有没有办法设置var drop为:

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

或者有更好的方法来做这件事吗?

Ker*_*Liu 16

由于document.elementFromPoint返回最顶层元素,您需要暂时将可拖动设置为display:nonepointer-events:none在其下方查找元素.我在下面创建了一个要点,它返回给定点上所有元素的列表.

尝试

var elementsArray = KoreSampl.atPoint(x,y,yourTableElement);
Run Code Online (Sandbox Code Playgroud)

要么

var elementsArray = KoreSampl.fromEvent(dropEvent, yourTableElement);
Run Code Online (Sandbox Code Playgroud)

然后

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

}
Run Code Online (Sandbox Code Playgroud)

使用下面的要点: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();
})(); 
Run Code Online (Sandbox Code Playgroud)


use*_*947 7

如果您可以省去旧浏览器,以下CSS将起作用:

只需将此规则应用于您正在拖动的最顶层元素即可.

#dragging {
  pointer-events: none;
}
Run Code Online (Sandbox Code Playgroud)