scrollIntoView()阻止其他侦听器触发

时间:2015-02-10 13:42:59

标签: javascript javascript-events dojo

我在事件目标上使用scrollIntoView()以确保它在其父overflow: scroll中可见,这主要是出于辅助功能。

我的问题是我还有与此元素关联的点击事件,当点击事件也触发焦点时e.target.scrollIntoView()阻止其他事件触发。

这是我目前的例子: http://jsfiddle.net/omhuorpr/

require([
    "dojo/query",
    "dojo/on"
], function(query, on){

    var el = query('#someElement');

    el.on('click', function(e){
        e.preventDefault();
        console.log("clicked");
    });

    el.on('focus', function(e){
        console.log("focus");
        e.target.scrollIntoView();
    });

});

如果单击该元素并检查控制台,它将仅触发焦点,如果您重新单击它,则会触发该单击。理想情况下,我想同时开启或只是点击。

一个简单的修复方法是通过超时将此进程移动到执行堆栈的末尾,但理想情况下我想找出scrollIntoView()阻止其他事件触发的原因。

1 个答案:

答案 0 :(得分:2)

这是因为focus事件在鼠标按下时触发,而click事件在鼠标按下时触发。如果元素已滚动,以便在释放按钮时鼠标指针不再位于元素上,则click事件不会触发。但是,如果滚动后鼠标指针仍在元素上方,则click 触发。

如果您在小提琴中增加字体大小并点击顶部附近,则会看到click火。如果单击底部附近并且元素从指针下方向外滚动,则click事件不会触发。 E.g。

#someElement {
    font-size:80px;
}

http://jsfiddle.net/omhuorpr/1/