elementFromPoint在onscroll事件中使用时返回null

时间:2011-11-22 13:09:41

标签: javascript scroll scrollable

我有一个简单的html页面,其中包含一个固定高度(可滚动)的主div和此div中的2个小div。我想在滚动期间将当前元素放在master div的中间点。它适用于除IE8以外的所有浏览器。在IE8中,document.elementFromPoint()在onscroll事件中返回null,将所有可能的值作为坐标。有人知道这个问题的解决方法或解决方案吗?

这是HTML代码:

<div id="mainDiv" style="height:300px;min-height:300px;overflow:auto;" onscroll="mouseScrolled();">
        <div id="div1" style="height:500px;min-height:500px;background-color:blue;display:block;">

    </div>
        <div id="div2" style="height:500px;min-height:500px;background-color:red;display:block;">

        </div>
    </div>

    <span id="debugSpan">
    </span>

的javascript:

function mouseScrolled(event) {

        var mainDiv = document.getElementById('mainDiv');
        var x = getXY(mainDiv)[0] + mainDiv.offsetWidth / 2;
        var y = getXY(mainDiv)[1] + mainDiv.offsetHeight / 2;
        var ctr = document.elementFromPoint(x , y);

        document.getElementById('debugSpan').innerHTML = "ClientX=" + x + "<BR>" + "ClientY=" + y +"<BR> Control:" + ctrId;

    }

    function getXY(obj) {
        var curleft = curtop = 0;
        if (obj.offsetParent) {
            do {
                curleft += obj.offsetLeft
                curtop += obj.offsetTop
            }
            while (obj = obj.offsetParent)
        }
        return { x: curleft, y: curtop };
    }

1 个答案:

答案 0 :(得分:3)

虽然可能不是最优雅的解决方案,但我最终检查是否收到了来自elementFromPoint的内容,如果没有,请使用setTimeout(fn,0)在下一个空闲时钟周期重试函数调用。在IE9和其他浏览器中,它似乎第一次工作;对于IE8,它设置了滚动事件处理完成后的超时和触发,这给出了一个元素。