2012-03-14 93 views
2

我不完全确定如何为此词组,所以我无法搜索它。基本上,我有一个keydown()绑定在$(document)。我想show()另一个div,并将所有keydown事件重新路由到这个div,并防止在文档处理程序中触发。这甚至是可能的,还是我必须将所有主键绑定到另一个div并从那里开始工作?防止keydown()被文档绑定捕获

+0

可以b一些代码,将有助于回答更好。 – Starx 2012-03-14 16:37:02

+0

我觉得这很清楚。另外,我还没有任何代码。这完全是理论上的猜测。 :) – 2012-03-14 16:38:48

回答

7

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

例:

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

但我如何确保我新显示的div首先获得事件?否则,我的文档处理程序将停止传播,事件永远不会到达div。对? – 2012-03-14 16:31:48

+0

@ElliotBonneville这是由事件冒泡处理。检查这个链接了解更多信息:http://www.quirksmode.org/js/events_order.html – 2012-03-14 16:33:58

+0

“添加一个字符到输入”是一个'textinput'事件,如果'keydown' ,'keypress'或'keyup'被阻止。更好的quirksmode链接将是http://www.quirksmode.org/dom/events/keys.html – Sinetheta 2012-03-14 16:34:29

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与click事件来解释它。

希望它有帮助!

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/

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/