在 jquery 自动完成控件上按 escape

发布于 2024-10-06 11:32:42 字数 493 浏览 2 评论 0原文

我有一组字段。在阅读模式下,它们在表格单元格中显示为文本。双击单元格会将记录置于编辑模式。在编辑模式下按“enter”即可提交更改。在编辑模式下按“esc”返回读取模式而不更改数据。

现在,每个字段都添加了 jQuery UI 自动完成控件。 当自动完成菜单可见时,我希望“输入”的行为与自动完成通常的行为相同(将输入中的值替换为选定的菜单值并关闭自动完成菜单)不< /strong> 提交更改/返回编辑模式。当按下退出键时,如果菜单打开,则执行通常的自动完成功能(将编辑字段返回到其先前的值并关闭菜单)而不返回到阅读模式。

我已在此处放置了我的问题的演示。目前,如果您在自动完成菜单项之一上按“enter”键,自动完成功能就会完成它的工作,并且更改会立即提交。按 escape 关闭自动完成菜单并取消编辑模式。

I have a set of fields. In read mode, they display as text within a table cell. Double clicking the cell puts the record in edit mode. Pressing "enter" while in edit mode commits the change. Pressing "esc" in edit mode returns to read mode without changing the data.

Now, each field has a jQuery UI autocomplete control added. When the autocomplete menu is visible, I want "enter" to behave as it normally does for autocomplete (replace the value in the input with the selected menu value and close the autocomplete menu) without commiting the change/returning to edit mode. And when pressing escape, if the menu is open, perform the usual autocomplete functions (return the edit field to its previous value and close the menu) without returning to read mode.

I have placed a demo of my problem here. Currently, if you press "enter" on one of the autocomplete menu items, autocomplete does its thing AND the changes are committed immediately. Pressing escape closes the autocomplete menu AND cancels edit mode.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼前雾蒙蒙 2024-10-13 11:32:42

使用自动完成的打开和关闭事件来取消绑定/重新绑定您的自定义行为,以便仅在自动完成菜单未打开时才发生。这将使事件不会变得混乱。我的工作代码如下:

function enterEditMode() {
    $("#output").append("<div>enter edit</div>");
    $("#read").hide();
    $("#edit").val($("#read").text()).show().focus();
}

function exitEditMode() {
    $("#output").append("<div>exit edit</div>");
    $("#read").show();
    $("#edit").hide();
}

function commitChanges() {
    $("#output").append("<div>commit</div>");
    $("#read").text($("#edit").val());
    exitEditMode();
}

function handleKeydown(event) {    
    $("#output").append("<div>handle keydown:"+event.which+"</div>");
    if (event.keyCode === 27) { exitEditMode(); }
    else if (event.keyCode === 13) { commitChanges(); }    
}

$(function() {
    $("#read").bind("dblclick", enterEditMode);
    $("#edit").bind("keydown", handleKeydown).autocomplete({
        source: ["this", "that", "the other"],
        open: function(){ $("#edit").unbind("keydown", handleKeydown); },
        close: function(){ $("#edit").bind("keydown", handleKeydown); }
    });
});

工作jsfiddle位于此处

Use the open and close events of the autocomplete to unbind/rebind your custom behavior so that it occurs only when the autocomplete menu is not open. This will keep the events from getting confused. My working code follows:

function enterEditMode() {
    $("#output").append("<div>enter edit</div>");
    $("#read").hide();
    $("#edit").val($("#read").text()).show().focus();
}

function exitEditMode() {
    $("#output").append("<div>exit edit</div>");
    $("#read").show();
    $("#edit").hide();
}

function commitChanges() {
    $("#output").append("<div>commit</div>");
    $("#read").text($("#edit").val());
    exitEditMode();
}

function handleKeydown(event) {    
    $("#output").append("<div>handle keydown:"+event.which+"</div>");
    if (event.keyCode === 27) { exitEditMode(); }
    else if (event.keyCode === 13) { commitChanges(); }    
}

$(function() {
    $("#read").bind("dblclick", enterEditMode);
    $("#edit").bind("keydown", handleKeydown).autocomplete({
        source: ["this", "that", "the other"],
        open: function(){ $("#edit").unbind("keydown", handleKeydown); },
        close: function(){ $("#edit").bind("keydown", handleKeydown); }
    });
});

The working jsfiddle is here.

森林很绿却致人迷途 2024-10-13 11:32:42

您可以使用选择和关闭事件来租用编辑模式

  close: function(event, ui) { enterEditMode()},
  select: function(event, ui) { enterEditMode()}

,它们位于您的代码中:

function enterEditMode() {
    $("#read").hide();
    $("#edit").show().focus();
}

function exitEditMode() {
    $("#read").show();
    $("#edit").hide();
}

function commitChanges() {
    $("#read").text($("#edit").val());
    exitEditMode();
}

$(function() {
    $("#read").dblclick(enterEditMode);
    $("#edit").keydown(function(event) {
        if (event.keyCode === 27) exitEditMode();
        else if (event.keyCode === 13) commitChanges();
    }).autocomplete({
        source: ["this", "that", "the other"],
          close: function(event, ui) { enterEditMode()},
         select: function(event, ui) {  enterEditMode()}


    });
});

工作示例:

http:// jsfiddle.net/9unaU/6/

更新:

进行了另一项更改,以确保在 exitEditMode 上隐藏自动完成

function exitEditMode() {
    $("#read").show();
    $("#edit, .autocomplete").hide();
}

功能 工作示例:

http://jsfiddle.net/9unaU/7/

更新 2:
编辑了 if 语句,以便仅在隐藏自动完成功能时才提交

if (event.keyCode === 27) exitEditMode();
        else if (event.keyCode === 13 && ($('.autocomplete').is(':hidden'))) commitChanges();

工作示例 2:
http://jsfiddle.net/9unaU/10/

You can use the select and close events to renter edit mode

  close: function(event, ui) { enterEditMode()},
  select: function(event, ui) { enterEditMode()}

Here they are in your code:

function enterEditMode() {
    $("#read").hide();
    $("#edit").show().focus();
}

function exitEditMode() {
    $("#read").show();
    $("#edit").hide();
}

function commitChanges() {
    $("#read").text($("#edit").val());
    exitEditMode();
}

$(function() {
    $("#read").dblclick(enterEditMode);
    $("#edit").keydown(function(event) {
        if (event.keyCode === 27) exitEditMode();
        else if (event.keyCode === 13) commitChanges();
    }).autocomplete({
        source: ["this", "that", "the other"],
          close: function(event, ui) { enterEditMode()},
         select: function(event, ui) {  enterEditMode()}


    });
});

Working Example:

http://jsfiddle.net/9unaU/6/

Update:

Made another change to ensure autocomplete is hidden on exitEditMode

function exitEditMode() {
    $("#read").show();
    $("#edit, .autocomplete").hide();
}

Working Example:

http://jsfiddle.net/9unaU/7/

Update 2:
Edited the if statement so it only commits if the autocomplete is hidden

if (event.keyCode === 27) exitEditMode();
        else if (event.keyCode === 13 && ($('.autocomplete').is(':hidden'))) commitChanges();

Working Example 2:
http://jsfiddle.net/9unaU/10/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文