Подтвердить что ты не робот

Присоединить 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/

4b9b3361

Ответ 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)
  });
});