Присоединить click-event к элементу в .select2-result
Я ищу способ привязать событие click к элементу select2-result.
Я пошел вперед и отформатировал результат и выбор с помощью
function format(state) {
if (!state.id) return state.text; // optgroup
return state.text + " <i class='info'>link</i>";
}
добавить "info" -icon
Теперь я пытаюсь подключить простой элемент click-event к элементу .info, но не могу заставить это работать:
$('.info').on('click', function(event){
event.preventDefault();
alert("CLICK");
$('#log').text( "clicked" );
});
Любая помощь?
Кто-нибудь с подобной проблемой?
Возможно ли это вообще?
Я подготовил jsFiddle по адресу: http://jsfiddle.net/s2dqh/3/
Ответы
Ответ 1
Поскольку Select2 lib предотвращает любые события кликов в списке popover, вы не можете напрямую привязывать события к .info
. Но вы можете переопределить метод onSelect
и поместить туда любой код, который вы хотите.
См. пример: http://jsfiddle.net/f8q2by55/
Обновление для нескольких выборок: http://jsfiddle.net/6jaodjzq/
Ответ 2
Это похоже на концепцию netme, но событие select2 неверно (возможно, разница версий), и вам нужно использовать stopPropagation для предотвращения выбора элемента:
http://jsfiddle.net/ZhfMg/
$('#mySelect2').on('select2-open', function() {
$('.select2-results .info').on('mouseup', function(e) {
e.stopPropagation();
console.log('clicked');
});
});
Если используется с x-редактируемым. Это происходит, когда x-editable переходит в режим редактирования (показанное событие), что когда select2 существует и вы можете подключить к нему функцию open.
$('#myXEditable').on('shown', function () {
$(this).data('editable').input.$input.on('select2-open', function() {
$('.select2-results .info').on('mouseup', function(e) {
e.stopPropagation();
console.log('clicked');
});
});
});
Ответ 3
Для версий Select2 перед 4.0.0 (поэтому 3.5.x и ниже) вы должны обратиться к этому ответу о привязке к onSelect
.
В новых версиях Select2 события больше не будут убиты в результатах, поэтому вы можете просто привязываться к событиям mouseup
/mousedown
, как обычно. Вам следует избегать привязки к событию click
, потому что по умолчанию браузеры не будут запускать его.
$(".select2").select2({
templateResult: function (data) {
if (data.id == null) {
return data.text;
}
var $option = $("<spam></span>");
var $preview = $("<a target='_blank'> (preview)</a>");
$preview.prop("href", data.id);
$preview.on('mouseup', function (evt) {
// Select2 will remove the dropdown on `mouseup`, which will prevent any `click` events from being triggered
// So we need to block the propagation of the `mouseup` event
evt.stopPropagation();
});
$preview.on('click', function (evt) {
console.log('the link was clicked');
});
$option.text(data.text);
$option.append($preview);
return $option;
}
});
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script>
<select class="select2" style="width: 200px;">
<option value="https://google.com">Google</option>
<option value="https://mail.google.com">GMail</option>
</select>
Ответ 4
Ни один из ответов выше не работал у меня для select2 4.0.0, поэтому вот что я в итоге сделал:
$(document).on('mouseup', '.select2-container--open .select2-results__option', function (e) {
// Act on the element
}
В частности, я хотел действовать только по ранее выбранному элементу:
$(document).on('mouseup', '.select2-container--open .select2-results__option[aria-selected=true]', function (e) {
// Do something on the previously-selected item
}
Ответ 5
Просто добавьте "open" прослушиватель и настройте еще один "приемник мыши" для тега ':
$("#select").on('open', function() {
$('.select2-results i').on('mouseup', function() {
alert('aaa');
});
});
Вот ссылка на мое решение: http://jsfiddle.net/EW8t7/
Ответ 6
Более простой подход в соответствии с документами.
$('#mySelect2').on('select2:select', function (e) {
var data = e.params.data;
console.log(data);
});
Удивлен, что не вижу ответа на это.
Ответ 7
Я думаю, что обработка Select2 события mouseup не позволяет элементу .info
получать событие click. Наличие элемента .info
для захвата события mouseup и предотвращения его распространения, похоже, исправляет это.
function format(state, container) {
if (!state.id) return state.text; // optgroup
container.append(state.text);
$('<i class="info">link</i>')
.appendTo(container)
.mouseup(function(e) {
e.stopPropagation();
})
.click(function(e) {
e.preventDefault();
alert('CLICK');
});
}
Это также можно сделать для поддержки ссылки в выбранном элементе, но там должно быть записано событие mousedown.
jsfiddle
Ответ 8
использовать по умолчанию триггер события select2select вместо использования других событий jquery
$('#mySelect2').on('select2:select', function (e) {
var data = e.params.data;
console.log(data);
});
для более подробной информации см. ссылку нижеhttps://select2.org/programmatic-control/events
Ответ 9
вещь кажется, что tgas будет удален сразу после закрытия ящика. Поэтому событие click не может быть запущено.
Я изменил несколько вещей + событие, которое будет прослушиваться. Это теперь mousedown...
function format(state) {
if (!state.id) return state.text; // optgroup
return state.text + " <a class='info'>link</a>";
}
$("select").select2({
formatResult: format,
formatSelection: format,
escapeMarkup: function(m) { return m; }
}).on('select2-open',function(){
console.log($('.info'))
$('.info').on('mousedown', function(event){
console.log("click")
$('#log').text( "clicked" );
event.preventDefault();
});
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.js"></script>
<select>
<option>red</option>
<option>green</option>
<option>blue</option>
</select>
<div id="log"></div>
Ответ 10
Вам нужно отменить событие mouseup из элемента .select2-results__options. Я делаю это в моей функции templateResult:
function templateResult(location) {
var $location = $([html with links]);
$('.select2-results__options').unbind('mouseup');
return $location;
}
Если вы хотите сохранить выбранное по умолчанию поведение select2 и закрыть раскрывающийся список, вам необходимо вручную запустить эти события:
$('.select2-results__options').unbind('mouseup');
$('a', $location).on('click', function (e) {
$('#locations_dropdown').select2('val', location.id);
$('#locations_dropdown').select2('close');
});
return $location;
Ответ 11
Просто столкнулся с этой проблемой с select2 v4.0.3 и в итоге использовал событие "select2: selection". Вот по сути как я это сделал:
var $select2 = $savedReportsList.select2({ [stuff] });
$select2.on('select2:selecting', function(e) {
var args = e.params.args;
if ($(args.originalEvent.target).hasClass('[something]')) {
if (confirm('Are you sure?')) {
window.location = '[somewhere]' + '/' + args.data.id;
}
return false; // stops propogation (so select2:select never fires)
});
});