jQuery如何创建和触发动态热键(keycode和:not()选择器?)

时间:2011-05-14 08:49:18

标签: jquery jquery-selectors keycode

我有一个我正在处理的Web应用程序,我希望用户能够动态定义和触发热键。我希望有人可以帮助我吗?

我已经使用相关的HTML创建了JSFiddle HERE

这是我的javascript:

// Assign Hotkey (this seems to be working)
$('input.hotkey').keydown( function(event) {
var hkey = event.keyCode;
if ( hkey == $('span#hk').text()){
    alert('This key is already in use');
} else
    $(this).parent().parent().prev().find('span#hk').text(hkey);
});

// Fire Hotkey (the problem might be here?)
$(document).not('input').keydown( function (event) {
    var hkey = event.keyCode;
    if (hkey == $('span#hk').text()){
         $("span#hk:contains("+hkey+")").parent().click();
    }
});

// Play Selected Track
$('#track').live('click', function () {
    // Fake Function
    var title = $('#title', this).text();
    alert(title + ' is playing...');
});

注意:我已经使用'space'和'left / right'箭头键作为全局热键 - 有没有办法保护/阻止它们被分配?

使用比.not('input')更好的选择器来防止在输入输入时触发音轨?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

$(document).not('input')找不到所有不属于input标记的元素。它找到所有不是输入元素的文档节点(其中有一个)(它们都是其中之一)。您所做的就是将处理程序附加到document。由于父元素会被通知其后代触发的事件,因此所有keydown事件都由此函数处理。

您应该使用event.target代替:

$(document).keydown( function (event) {
    if (event.target.nodeName.toLowerCase() !== 'input') {
        var hkey = event.keyCode;
        if (hkey == $('span#hk').text()){
            $("span#hk:contains("+hkey+")").parent().click();
        }
    }
});

if语句表示如果事件源自input元素,则处理程序不会执行任何操作。