【问题标题】:How to prevent closing the menu after a select?如何防止选择后关闭菜单?
【发布时间】:2016-03-24 03:16:11
【问题描述】:

我正在使用jQuery Autocomplete 小部件,并且受this question 的启发,为了防止在选择后关闭菜单,我想出了以下代码:

$(#input_field).autocomplete({
  select   : function(event, ui) {

    // I also tried to run 'ui.item.data( "item.autocomplete" );' and it happens
    // the same thing (keep reading for more information).
    ui.item.option.selected = false;

  },
  ...
});

有效:选择后菜单未关闭。但是,我收到以下错误(在 Firebug 控制台中):

TypeError: ui.item.option is undefined

即使使用option.selected = false,我也会得到TypeError: option is undefined,但它可以按预期工作。

我该如何解决?

【问题讨论】:

  • 你能在jsfiddle.net上提供一个测试用例吗?
  • 尝试在 select 回调函数中添加 console.log(ui) 并检查您的控制台以查看在 ui 参数中传递的确切内容。
  • @Bogdan - 记录ui 对象,显示{ label="The label", value="The value" }。就是应该这样。
  • 您使用的是最新的 jQuery 版本吗?根据Autocomplete Widget API Documentationselect 事件应该将ui.item 传递给事件处理函数。

标签: javascript jquery jquery-ui autocomplete widget


【解决方案1】:

不幸的是,当前的 jQuery UI 中没有选项/方法来处理这个问题。 您尝试使用的方法适用于旧版本的 jQuery UI。在当前版本中,ui.item 没有您尝试访问的比例。它里面只有{"label":"Java","value":"java"},所以你有一个错误。

因此,要使其正常工作,您需要一些技巧。通过检查 jQuery UI 源代码,我发现最简单和最可靠的方法是在没有自定义方法的情况下覆盖 public close 方法。如果您永远不需要关闭自动完成功能,这真的很容易:

$("#input_field").data('autocomplete').close = function() {};

但如果你只想在鼠标选择项目时阻止关闭,那就更复杂了:

// custom close method
(function(){
    var instance = $("#input_field").data('autocomplete');
    var origClose = instance.close, mouseFlag;

    // capture mouse events
    instance.menu.element.on('mousedown', function() {
        mouseFlag = true;
    });
    instance.close = function(e) {
        if(!mouseFlag) {
            // call original method if drop isn't closed by mouse
            origClose.apply(this, arguments);
        } else {
            // clean flag in setTimeout to avoid async events
            setTimeout(function(){
                mouseFlag = false;    
            },1);
        }
    }
}());​

工作JSFiddle

【讨论】:

  • 有没有办法在select 事件之后重新打开 jQuery 自动完成菜单以避免黑客攻击?
  • 我为此开了一个new question
  • 不,没有公开的方法可以做到这一点。它是通过私有_suggest 方法打开的。您应该编写自定义的自动完成小部件,或者使用我提供的上述技巧。
  • 你问的是不同的事情。这个问题是关于如何防止从隐藏中掉落,而新问题是关于打开菜单。这个解决方案怎么样:jsfiddle.net/m2jTZ?不知道它在 UI Datepicker 的多个实例上会如何表现。
  • 为什么要引入 Datepicker(以及相关问题)?自动完成功能是否与该小部件相关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2015-06-25
相关资源
最近更新 更多