【问题标题】:Add click event on additional button in Selectize.js dropdown list在 Selectize.js 下拉列表中的附加按钮上添加单击事件
【发布时间】:2013-12-28 01:28:50
【问题描述】:

我正在使用您的库 Selectize.js,但我遇到了一个问题。

我想在$dropdown_content中添加一个按钮,所以我使用render.option方法。

当我想捕捉click 事件时,我无法做到。所有事件都被“行”捕获。我怎样才能做到这一点?

$('#myInput').selectize({
    render: {
        option: function(item, escape) {
            return '<div class="item">' +
                '<img class="autocompleteAvatar" src="' + (typeof item.avatar != 'undefined' ? item.avatar : '') + '"/>' +
                (typeof item.nick != 'undefined' && escape(item.nick).length>0 ? '<span class="nick">'+escape(item.nick)+'</span><br/>':'') +
                (typeof item.value != 'undefined' && escape(item.value).length>0 ? '<span class="email' +
                    (typeof item.nick != 'undefined' && escape(item.nick).length>0 ? '':' only') +
                    '">'+escape(item.value)+'</span>' : '') +
                '<a href="#" class="remove" data-id="'+(typeof item.id == 'undefined' || item.id==''? '' : item.id)+'" data-source="'+(typeof item.source=='undefined' ? '' : item.source)+'" data-email="'+escape(item.value)+'"></a>' +
                '<div class="border"></div>' +
                '</div>';
        }
    }
});

$('div.selectize-dropdown').on('click', 'a.remove', function(event){
    event.preventDefault();
    event.stopPropagation();

    alert('Hello');
    //can't see it :-(
});

【问题讨论】:

  • 你是怎么做到的?发布一些代码,或者 jsfiddle。
  • 我已经更新了第一篇文章。
  • 试试$('#myInput').click(function(){ alert('Hello') });
  • 尝试改用这个ivaynberg.github.io/select2....

标签: javascript jquery selectize.js


【解决方案1】:

这个问题的原因是 selectize.js 为点击选项注册了一个 onMouseDown 事件处理程序。此处理程序在单击处理程序之前调用,并防止调用其他处理程序。如果您使用 onMouseDown 处理程序而不是 onClick 处理程序,它应该可以工作。

处理程序也必须内联注册,因为只有在打开选项下拉菜单时才会呈现实际的 HTML。

我不得不花一些时间来解决这个问题。我们还需要在我们的选项列表中包含具有行为的复杂 HTML,并且通过 selectize 进行的激进事件处理程序预防会导致此处出现问题。在我看来,不阻止事件处理程序将是一个有用的增强。

【讨论】:

  • 我需要为每个选项添加额外的按钮,这不会“选择”选项,而是做不同的事情。我做了,所以一行选项由彼此相邻的多个元素组成(按钮不是“在”选项元素中)。更新了库,现在它在render() 中添加了html[0] 之类的元素,而不是html。现在我必须再次重建一切。生活很艰难:)
【解决方案2】:

我在这件事上挣扎了一段时间,最终得到了这样的结果。我希望它能帮助其他人定义他们自己的解决方案来解决这个和/或其他类似的问题。该代码基于上述问题中给出的示例,并且未在该特定设置中进行测试。 “魔法”发生在 onDropdownOpen 方法中,这应该是我们感兴趣的逻辑。

$('#myInput').selectize({
  render: {
    option: function(item, escape) {
      return '<div class="item">' +
        '<img class="autocompleteAvatar" src="' + (typeof item.avatar != 'undefined' ? item.avatar : '') + '"/>' +
        (typeof item.nick != 'undefined' && escape(item.nick).length > 0 ? '<span class="nick">' + escape(item.nick) + '</span><br/>' : '') +
        (typeof item.value != 'undefined' && escape(item.value).length > 0 ? '<span class="email' +
          (typeof item.nick != 'undefined' && escape(item.nick).length > 0 ? '' : ' only') +
          '">' + escape(item.value) + '</span>' : '') +
        '<a href="#" class="remove" data-id="' + (typeof item.id == 'undefined' || item.id == '' ? '' : item.id) + '" data-source="' + (typeof item.source == 'undefined' ? '' : item.source) + '" data-email="' + escape(item.value) + '"></a>' +
        '<div class="border"></div>' +
        '</div>';
    }
  },
  onDropdownOpen: function() {
    $('.selectize-dropdown-content').on('mousedown', 'div[data-selectable] a.remove', function(event) {
      event.preventDefault();
      event.stopPropagation();

      alert('Hello');

    });
  }
});

【讨论】:

  • 这不是每次打开下拉菜单都会注册新事件吗?
  • onInitialize 事件用于注册 eventListener 一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多