【问题标题】:Selectize.js delegated event on option not workingSelectize.js 选项上的委托事件不起作用
【发布时间】:2017-01-10 08:21:53
【问题描述】:

我目前正在尝试收听下拉菜单中生成的选项的点击事件,但我目前无法实现这一点。

由于在加载 DOM 时不会生成选项,因此我将事件委托给文档以侦听下拉选项的点击。我的代码目前如下所示:

var $accountsSelectize = $('#accounts-input').selectize({
  ...
});

$(document).on('click', '.accounts-input-selectize .option', function(event) {
  alert('An option was clicked!');
});

但这似乎不起作用。知道为什么会这样吗?任何有关为什么此事件根本没有触发的线索都将受到欢迎。

编辑:仅供参考,我正在向 HTML 输入元素添加一个类,这就是为什么我要监听 .accounts-input-selectize .option 上的点击:

<input type="text" id="accounts-input" class="accounts-input-selectize" placeholder="Search accounts">

【问题讨论】:

  • selectize 中没有 API change 事件吗?为什么需要点击事件?
  • 有一个 API change 事件,但如果我单击已选择的选项,它不会触发,这就是为什么我需要单击事件来检查该选项是否以前已选中。

标签: javascript jquery events selectize.js


【解决方案1】:

这个问题听起来很简单,但事实并非如此。问题是 selectize 会阻止所有默认值,所以一开始我会推荐使用这个库,但如果你真的想要,还有一种方法可以查明用户是否更改了选项。

$('#select-country').selectize({

      //When user selects the widget we'll rememberize its value
      onFocus: function(){
        $(this).data('temp-saved', $('#select-country').val());
      },

      //On blur we check if the value has not changed
      onBlur: function(){
        var previous = $(this).data('temp-saved');
        var current = $('#select-country').val();

        if (current == previous) {
                console.log('NOT changed!');
        }
      },

      //And on change we sure that the value has changed
      onChange: function(current){
            var previous = $(this).data('temp-saved');
            console.log('changed from', previous, 'to', current);
      }
  });

https://jsfiddle.net/mo1Ljm7r/13/

【讨论】:

  • 感谢您的帮助,我投票赞成,因为它可能对其他人有用,但这种方法对我不起作用,因为我需要检查 点击 用于已选择的值(在模糊或焦点上可能适用于其他情况),但在单击已选择的选项时不会触发这些事件。我将在一分钟内发布我的解决方案。
【解决方案2】:

对于一个公认的半生不熟的“解决方案”,我的方法是创建一个插件来拦截默认事件侦听器以点击选项:

Selectize.define('click2deselect', function(options) {
  var self = this;
  var setup = self.setup;
  this.setup = function() {
    setup.apply(self, arguments);

    // Intercept default handlers
    self.$dropdown.off('mousedown click', '[data-selectable]').on('mousedown click', '[data-selectable]', function(e) {
      var value = $(this).attr('data-value'),
          inputValue = self.$input.attr('value');

      if (inputValue.indexOf(value) !== -1) {
        var inputValueArray = inputValue.split(','),
            index = inputValueArray.indexOf(value);

        inputValueArray.splice(index, 1);

        self.setValue(inputValueArray);
        self.focus();
      } else {
        return self.onOptionSelect.apply(self, arguments);
      }
    });
  }
});

下一步是使用之前创建的插件初始化 Selectize,如下所示:

var $accountsSelectize = $('#accounts-input').selectize({
  plugins: ['click2deselect'],
  ...
});

就是这样。

【讨论】:

  • 用大炮射鸟)
  • 然而,这是唯一适用于我的案例的解决方案。如果提出另一个更简单的解决方案,我很乐意接受它作为答案。
  • 您将如何为此实现 onclick 处理程序?
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多