我正在使用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()
答案 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));