运行功能时检查是否按下了shift键?

时间:2017-06-15 18:10:58

标签: jquery

我正在使用jQuery插件来替换选择框,如果在按Enter键的同时按住shift键的话选择一个项目,我想添加一个隐藏的输入。我的问题是选择插件监听器发生在我的keydown监听器之前。有没有办法让我的第一个on()在我的第二个on()之前执行?或者有没有办法检查第二个on()内是否有换档键?如果我将e.shiftKey置于第二个undefined内,on()会给我var shiftHeld = false; $(document).on('keydown', function(e) { if(e.which == 13) { shiftHeld = e.shiftKey; } }); $menu = $('#menu').select2(); $menu.on('select2:close', function (e) { if(shiftHeld) { $('#form').append('<input type="hidden" name="shift" value="1" />'); } form.submit(); }); 。谢谢您的想法!

import kivy
kivy.require('1.10.0')
from kivy.app import App
from kivy.uix.slider import Slider
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label``

class app(App):

    def build(self):
        layout = BoxLayout(orientation='vertical')
        slide = Slider(min=-100, max=100,value=0)
        label = Label(text=str(slide.value))
        layout.add_widget(slide)
        layout.add_widget(label)
        return layout
app().run()

2 个答案:

答案 0 :(得分:1)

Javascript中的事件模型从文档元素下降到焦点元素(捕获阶段),然后再次上升(冒泡阶段)。

document   ->      element    ->    document
------- CAPTURE ------|----- BUBBLING ------

您通常在冒泡阶段捕获事件(目标元素 - &gt;文档)。请查看What is event bubbling and capturing?https://www.quirksmode.org/js/events_order.html

但是,您也可以将侦听器设置为捕获阶段,这样您就可以在子元素通知事件之前对父元素的子事件做出反应。

这样做:

function handleShift(e) { shiftHeld = e.shiftKey }
document.addEventListener("keydown", handleShift, true);
document.addEventListener("keyup", handleShift, true);

在事件到达您的元素之前,将调用此处理程序。请注意最后一个参数“true”,表示您希望在捕获阶段设置处理程序。

答案 1 :(得分:0)

只需在您的班次检查中添加键盘,以便在释放班次时更新shiftHeld值:

var shiftHeld = false;
$(document).on('keydown keyup', function(e) {
   if(e.which == 13) {
       shiftHeld = e.shiftKey;
    }
});

function closeHandler() {
    if(shiftHeld) { $('#form').append('<input type="hidden" name="shift" value="1" />'); }
    form.submit();
}

$menu.on('select2:close', setTimeout("closeHandler()",100));