如果jqueryUI日期选择器处于活动状态,如何捕获键盘按键

4

JQGrid列包含在行内编辑模式下使用的jQueryUI日期选择器。如果DataPicker输入元素获得焦点并按下Ctrl+S或其他键,则不会执行body_onkeydown:IE9会调用ctrl+s默认行为(保存对话框)。在FireFox中,body_onkeydown也不会执行。

如何修复此代码,以便在DatePicker具有焦点时可以捕获按键?

DatePicker的定义如下:

    $(elem).datepicker({
        dateFormat: 'dd.mm.yy',
        autoSize: true,
        showOn: 'button', 
        changeYear: true,
        changeMonth: true,
        showButtonPanel: true,
        showWeek: true
    });

用于捕获ctrl+s按键的代码如下:

$(function () {
    $("html").keydown(body_onkeydown);
});


function body_onkeydown(evt) {
    // Why this function is not executed if datepicker has focus?
    if (evt.ctrlKey) {
        switch (evt.keyCode) {
            case 83: $("#grid_savebutton").click(); break;         
              }
        cancel(evt);
        return false;
    }

function cancel(evt) {
    evt.returnValue = false;
    evt.keyCode = 0;
    evt.cancelBubble = true;
    evt.preventDefault();
    evt.stopPropagation();
}
1个回答

2

这是个好问题!在jqGrid的代码中,有时候会在事件处理程序中发现return falsestopPropagation,我个人认为这些是不必要的。在你的情况下,问题出现在jquery.jqGrid.src.js的第8237行(版本为4.1.2),或者是grid.inlinedit.js的第87行(请参见此处):

e.stopPropagation();

如果您评论喜欢内联编辑,将不再阻止 keydown 事件的传播,正如您在演示中看到的那样,您将能够在内联编辑期间捕获 Ctrl+S

谢谢。非常好。我添加了这个补丁。也许将这行代码移动到 if (e.keyCode === 27) { $($t).jqGrid("restoreRow", rowid, afterrestorefunc); e.stopPropagation(); } 中会更好,以阻止 esc 键的传播。顺便问一下,你有没有看过 http://stackoverflow.com/questions/7558869/how-to-show-autocomplete-field-value-in-form-editing 中描述的问题? - Andrus
@Andrus:是的!听起来不错。试试这个,但我认为你是对的。上次我有更少的空闲时间,所以在stackoverflow上发布了比以前更少的答案。希望到本周末我会有更多时间。 - Oleg
@Andrus: 顺便说一下,我花了很多时间在开发新的jqGrid功能上:多行列标题(列标题组)。请参见[演示](http://www.ok-soft-gmbh.com/jqGrid/SimpleLocalGridHeadersWithFirstRow4.htm)和[答案](https://dev59.com/YlvUa4cB1Zd3GeqPpg7A#7351638)。 这项工作尚未完成,但我肯定在jqGrid的下一个版本中,也就是大约10天后发布的版本中,将以某种形式实现多标题功能(列标题组)。 - Oleg
谢谢。是否会在下一个jqGrid发布中包含这个补丁呢?我还没有看到关于下一个发布日期的任何信息。有趣的是,e.stopPropagation()会启用IE9默认的Ctrl + S行为(保存对话框)。它应该完全禁用Ctrl + S。 - Andrus
1
@Andrus:您可以在此处阅读有关新版本的信息(https://github.com/tonytomov/jqGrid/commit/d2648c048a04571677eb86132ea3ddd0899afb15#commitcomment-613764)。如果您想要像`stopPropagation`一样的补丁,请在trirand论坛上发布错误报告。 - Oleg
谢谢。我在http://www.trirand.com/blog/?page_id=393/bugs/keyboard-shortcuts-are-not-working-in-inline-edit-can-oleg-patch-applied/上发布了它。感谢git链接。我从这段代码中发现可以添加和编辑jqgrid中的文件数据以及其他行数据。使用这个方法合理吗?还是http://tpeczek.blogspot.com/2011/03/jqgrid-and-aspnet-mvc-form-editing-with.html上传方法更好? - Andrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接