检测模态对话框上的按键不起作用
detect key press on modal dialog not working
我想检测用户是否在显示模式时按下了任意键。我尝试了以下代码,但没有触发事件。
代码片段:
$("#modal_confirmation_dp_change").on('keydown keyup input', function ( e ) {
alert();
});
如果我尝试测试点击事件,它会被触发。
$("#modal_confirmation_dp_change").on('click', function ( e ) {
alert();
});
我正在使用 Twitter bootstrap 模式。我错过了什么吗?
答案:
我找到了解决问题的办法。看来我不应该指向模态的 id 以便检测到按键事件。
您不应该像这样使用多个事件,因为根据您的事件计数,它会触发三次,一次用于 keydown
,一次用于 keyup
,一次用于 input
。这仍然不是问题,问题是您触发的 click
。那是jQuery事件对象的事件,而你需要在DOM上触发click
。
您应该触发 DOM 的原生 .click()
事件:
$("#modal_confirmation_dp_change").on('keydown', function ( e ) {
var key = e.which || e.keyCode;
if (key == 13) {
$('#changed_dp_ok')[0].click(); // <----use the DOM click this way!!!
}
});
$(document).on('keydown', function(e) {
if (e.which == 13) {
//$('.btn').click(); // <----this wont work
$('.btn')[0].click(); // <---but this works
}
})
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<div class="container">
<h2>Modal Example</h2>
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>
<!-- Modal -->
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body">
<p>Some text in the modal.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
我找到了解决问题的方法。看来我不应该指向模态的 id 以便检测到按键事件。
$(document).on('keydown keyup input click', function (e) {
if($('#modal_confirmation_dp_change').is(':visible')) {
var key = e.which;
if (key == 13) { //This is an ENTER
$('#changed_dp_ok').click();
}
}
});
我发现将焦点放在模态框上是更好的解决方案。
为此,您必须向模态容器添加 tabindex
参数,然后使用 JavaScript 设置其焦点。一旦完成,它就可以接收键盘事件:
我想检测用户是否在显示模式时按下了任意键。我尝试了以下代码,但没有触发事件。
代码片段:
$("#modal_confirmation_dp_change").on('keydown keyup input', function ( e ) {
alert();
});
如果我尝试测试点击事件,它会被触发。
$("#modal_confirmation_dp_change").on('click', function ( e ) {
alert();
});
我正在使用 Twitter bootstrap 模式。我错过了什么吗?
答案: 我找到了解决问题的办法。看来我不应该指向模态的 id 以便检测到按键事件。
您不应该像这样使用多个事件,因为根据您的事件计数,它会触发三次,一次用于 keydown
,一次用于 keyup
,一次用于 input
。这仍然不是问题,问题是您触发的 click
。那是jQuery事件对象的事件,而你需要在DOM上触发click
。
您应该触发 DOM 的原生 .click()
事件:
$("#modal_confirmation_dp_change").on('keydown', function ( e ) {
var key = e.which || e.keyCode;
if (key == 13) {
$('#changed_dp_ok')[0].click(); // <----use the DOM click this way!!!
}
});
$(document).on('keydown', function(e) {
if (e.which == 13) {
//$('.btn').click(); // <----this wont work
$('.btn')[0].click(); // <---but this works
}
})
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<div class="container">
<h2>Modal Example</h2>
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>
<!-- Modal -->
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body">
<p>Some text in the modal.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
我找到了解决问题的方法。看来我不应该指向模态的 id 以便检测到按键事件。
$(document).on('keydown keyup input click', function (e) {
if($('#modal_confirmation_dp_change').is(':visible')) {
var key = e.which;
if (key == 13) { //This is an ENTER
$('#changed_dp_ok').click();
}
}
});
我发现将焦点放在模态框上是更好的解决方案。
为此,您必须向模态容器添加 tabindex
参数,然后使用 JavaScript 设置其焦点。一旦完成,它就可以接收键盘事件: