按类在给定位置查找DOM中的元素

时间:2014-07-22 18:45:19

标签: javascript html dom draggable

我正在尝试制作拖放功能,当我拖动时,我需要找到相对于具有某个类的div的位置。问题是这个div与我拖动的元素重叠。为了解决这个问题,我有一个循环,我只是将每个元素的显示样式设置为none,然后再次使用elementFromPoint。所以像这样:

e = document.elementFromPoint(x, y);
while(!e.hasClass("abc")) {
    e.style.display = "none";
    e = document.elementFromPoint(x, y);
}
return e;

我面临的问题是,我相信当我将dom元素的显示样式设为无时,窗口会向上移动。我想避免这种情况。还有其他方法可以解决这个问题吗?

我正在尝试使用vanilla javascript编写解决方案。

感谢。

2 个答案:

答案 0 :(得分:2)

oslego gist显示了解决方案。

//
// returns a list of all elements under the cursor
//
function elementsFromPoint(x,y) {
    var elements = [], previousPointerEvents = [], current, i, d;

        // get all elements via elementFromPoint, and remove them from hit-testing in order
    while ((current = document.elementFromPoint(x,y)) && elements.indexOf(current)===-1 && current != null) {

            // push the element and its current style
        elements.push(current);
        previousPointerEvents.push({
                value: current.style.getPropertyValue('pointer-events'),
                priority: current.style.getPropertyPriority('pointer-events')
            });

            // add "pointer-events: none", to get to the underlying element
        current.style.setProperty('pointer-events', 'none', 'important'); 
    }

        // restore the previous pointer-events values
    for(i = previousPointerEvents.length; d=previousPointerEvents[--i]; ) {
        elements[i].style.setProperty('pointer-events', d.value?d.value:'', d.priority); 
    }

        // return our results
    return elements;
}

您可以修改该功能,使其完全符合您的要求,也可以在返回的数组中搜索符合条件的元素。

答案 1 :(得分:1)

好吧,你可以尝试使用

e.style.visibility = 'hidden'; 

而不是

e.style.display = "none";

这样,元素就会从视图中隐藏,但它仍占用布局中的空间。我认为这对你有用。