按下键时禁用悬停

时间:2015-07-01 04:18:07

标签: javascript mouseevent addeventlistener

我实现了自定义下拉菜单,当我通过键盘移动时遇到问题:悬停也有效,我不知道如何禁用它。我已将代码粘贴到此处http://jsfiddle.net/4o0bcv1d/,但此处我的代码工作正常。当我将代码复制到index.html时 - 当我通过键盘移动时,悬停再次起作用。 我怎么解决它?

var doc = document;
var keydown_count = -1;

var dropdown_content = doc.querySelector('.dropdown-content');
var dropdown_items = doc.querySelectorAll('.dropdown-item');
var dropdown_items_length = dropdown_items.length;

var clear_navigation_hover = function () {
    for (var i = 0; i < dropdown_items_length; ++i) {
        dropdown_items[i].classList.remove('dropdown-item--hover');
    };
}

var navigation_hover_by_keydown = function (event) {
    var event = event || event.window;
    var UP = 38;
    var DOWN = 40;
    var SCROLL_STEP = 66;

    if (event.keyCode === UP) {
        keydown_count--;

        if (keydown_count < 0) {
            keydown_count = dropdown_items_length - 1;
            dropdown_content.scrollTop = 66 * dropdown_items_length;
        }

        if (keydown_count < (dropdown_items_length - 3)) {
            dropdown_content.scrollTop -= 66;
        };

    } else if (event.keyCode === DOWN) {
        keydown_count++;

        if (keydown_count >= dropdown_items_length) {
            keydown_count = 0;
            dropdown_content.scrollTop = 0;
        }

        if (keydown_count > 3) {
            dropdown_content.scrollTop += 66;
        };

    }
    clear_navigation_hover();
    dropdown_items[keydown_count].classList.add('dropdown-item--hover');
}

var dropdown_input = doc.querySelector('.dropdown-input');
dropdown_input.addEventListener('keydown', navigation_hover_by_keydown, false);

var navigation_hover_by_hover = function () {
    clear_navigation_hover();
    this.classList.add('dropdown-item--hover');
    keydown_count = this.getAttribute('data-index');
    console.log('hover');
}

for (var i = 0; i < dropdown_items_length; ++i) {
    dropdown_items[i].addEventListener('mouseover', navigation_hover_by_hover, false);
}

3 个答案:

答案 0 :(得分:2)

您可以使用CSS pointer-events功能禁用任何页面元素上的悬停。在按键上,您需要将此属性添加到body标签中,如此

document.body.style.pointerEvents = 'none';

再次在密钥释放时,您可以删除此属性,以便鼠标悬停再次开始工作。所以在关键版本中你需要做

document.body.style.pointerEvents = 'auto';

pointer-events属性允许将HTML元素排除在鼠标目标之外。除非已为该节点显式覆盖指针事件属性,否则所有后代元素也将被排除在鼠标目标之外。

答案 1 :(得分:0)

在您的代码中添加此行

$(this).unbind('mouseenter mouseleave')

答案 2 :(得分:0)

你可以设置css选择器:hover,hover:not(.unhover),可以使用js添加类.unhover