我正在尝试将一个按钮放入select2结果项(允许用户删除项目)。我设法放置按钮,但我还没有设法处理他们的点击事件。不知何故,事件不会被提升。我认为这就像select2在按钮的点击事件提升之前关闭下拉列表,但是无法弄清楚我是如何让它工作的。
这是我现在拥有的片段。
...
formatResult: function (item) {
return item.text + "<button class='btn btn-xs btn-default pull-right select2-result-button' data-id='" + item.id + "'>×</button>";
}
...
$(document).on("click", ".select2-result-button", function (e) {
alert("clicked: " + $(this).data("id"));
e.preventDefault();
e.stopPropagation();
return false;
});
这是一个演示fiddle。我也尝试了mousedown活动但没有成功。
答案 0 :(得分:3)
您应该看一下这个答案:stackoverflow.com/a/15637696/1127669:select2
库可以阻止弹出列表中的任何点击事件。
但您可以像这样重新定义onSelect
事件:jsfiddle.net/qouo8uog/33。
s2list.onSelect = (function (fn) {
return function (data, options) {
var target;
if (options != null) {
target = $(options.target);
}
// In case where the target is your own button, handle it
if (target && target.hasClass('select2-result-button')) {
alert("clicked: " + $(target).data("id"));
} else {
return fn.apply(this, arguments);
}
}
})(s2list.onSelect);
答案 1 :(得分:0)
在一天结束时,我决定修补select2源代码而不是破解选项。可能值得在github项目上提出拉取请求,但目前我没有时间准备它。
在两个onSelect实现(单个和多个)中,我已将此代码放在前面。
onSelect: function (data, options) {
// @@ implement a way to be able to place buttons in results
// this will check if there is an event target (in case when selection is invoked by mouse/touch), and if the target is a result button, trigger the result button event on the element, and skip default selecting behaviour
if (options && options.target && $(options.target).hasClass('select2-result-button')) {
var evt = $.Event("select2-result-button-click", { choice: data, button: options.target });
this.opts.element.trigger(evt);
return;
}
...
}