防止keydown()被文档绑定捕获

时间:2012-03-14 16:27:07

标签: javascript jquery

我不确定如何说出来,所以我无法搜索它。基本上,我在keydown()上有一个$(document)绑定。我想show()另一个div,并将所有keydown事件重新路由到此div并阻止在文档处理程序中触发。这是否可能,或者我是否必须将所有主要的键绑定放在另一个div上并从那里开始工作?

4 个答案:

答案 0 :(得分:7)

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

例如:

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

答案 1 :(得分:2)

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(),在第一次使用时可能有点混乱,但我创建了一个demo点击事件来解释它。

希望它有所帮助!!

答案 2 :(得分:1)

尝试:

​$(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/

答案 3 :(得分:1)

我能想到的唯一方法就是在输入或文档以外的其他东西上运行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事件由文档keydown事件触发。我还使用jQuery数据函数轻微破解了将事件对象传递给隐藏的div。

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