防止文档绑定捕获keydown()



我不知道该如何表达,所以我无法搜索它。基本上,我在$(document)上有一个keydown()绑定。我想show()另一个div,并将所有keydown事件重新路由到此div,并防止在文档处理程序中触发。这可能吗,或者我必须把所有的主键绑定放在另一个div上,然后从那里开始工作?

e.stopPropagation,或e.preventDefault(视情况而定)其中e是事件。

例如:

function onKeyDown(e) {
   doStuff();
   e.preventDefault();
}

e.preventDefault()将阻止事件的默认行为。你需要的是使用e.stopPropagation(),这样事件就不会在DOM结构中冒泡。

$(element).keydown(function(e) {
     // do the task
     // allow the default behaviour also
     e.stopPropagation();
   //^. BUT stop the even bubbling up right here
});

e.stopProgation(),掌握第一个可能有点困惑,但我创建了一个带有点击事件的演示来解释它

希望它能有所帮助!!

尝试:

​$(document).on('keydown', function (evt) {
  $('#foo').show().trigger(evt);
});​​​​​
$('#foo').on('keydown', function (evt) {
  console.log(evt);
  return false; // this is very important. Without it, you'll get an endless loop.
});
​

演示:http://jsfiddle.net/Z7vYK/

我能想到的在输入或文档之外的其他东西上运行keydown事件的唯一方法就是手动触发它。你可以让一个全局变量跟踪你的div是否显示,然后相应地在你的div上触发事件。

这里有一个这样的解决方案

HTML

<a href="#" onclick="showdiv();">Show div</a>
<div id="hiddendiv"></div>​

Javascript

var showing = false;
function showdiv()
{
    showing = true;
    $('#hiddendiv').show(200);
}
// Set up events on page ready
$(function() {
    $(document).keydown(function(e) {
        // If the div is showing, trigger it's keydown
        // event and return
        if(showing)
        {
            $('#hiddendiv').data('keydown_event', e).keydown();
            return true;
        }
        alert('Document keydown! Keycode: ' + e.keyCode);
        // Otherwise do the normal keydown stuff...
    });
    // Keydown for the hidden div
    $('#hiddendiv').keydown(function() {
        e = $(this).data('keydown_event');
        alert('Hiddendiv keydown! Keycode: ' + e.keyCode);
        // Make sure to stop propagation, or the events
        // will loop for ever
        e.stopPropagation();
        return false;
    });
});

​正如您所看到的,#hiddendiv keydown事件是由document keydown事件触发的。我还包含了一个使用jQuery数据函数将事件对象获取到隐藏div的小技巧。

以下是代码演示:http://jsfiddle.net/Codemonkey/DZecX/1/

最新更新