32

我正在寻找一种将点击事件附加到 select2-result-item 的方法。我已经继续并通过格式化结果和选择

function format(state) {
    if (!state.id) return state.text; // optgroup
    return state.text + " <i class='info'>link</i>";
}

添加一个“信息”图标我现在正在尝试将一个简单的点击事件附加到 .info-element 但无法使其正常工作:

$('.info').on('click', function(event){
    event.preventDefault();
    alert("CLICK");
    $('#log').text( "clicked" );
});

有什么帮助吗?有类似问题的人吗?这可能吗?

我准备了一个 jsFiddle:http: //jsfiddle.net/s2dqh/3/

4

12 回答 12

39

因为 Select2 lib 阻止了弹出列表上的任何单击事件,所以您不能.info直接将事件绑定到。但是您可以重新定义onSelect方法并在那里放置您想要的任何代码。

见例子:http: //jsfiddle.net/f8q2by55/

多项选择更新:http: //jsfiddle.net/6jaodjzq/

于 2013-03-26T12:59:36.517 回答
11

这在概念上与 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-editable 一起使用。这样做是当 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');
        }); 
    });
});
于 2013-06-12T21:35:27.150 回答
11

对于 4.0.0 之前的 Select2 版本(所以 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>

在此示例中,我们停止事件的传播,mouseup以便浏览器触发click事件​​。如果您不使用实际链接,而是只需要捕获一个click事件,您应该只钩入该mouseup事件。

于 2015-08-09T13:45:01.943 回答
7

使用默认的 select2select 事件触发器而不是使用其他 jquery 事件

$('#mySelect2').on('select2:select', function (e) {
    var data = e.params.data;
    console.log(data);
});

有关更多详细信息,请参阅以下链接 https://select2.org/programmatic-control/events

于 2019-08-08T07:21:16.100 回答
6

根据文档的更简单的方法。

$('#mySelect2').on('select2:select', function (e) {
    var data = e.params.data;
    console.log(data);
});

很惊讶没有看到任何答案。

于 2017-10-13T07:05:09.490 回答
6

对于 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
}
于 2015-12-23T16:32:28.967 回答
2

我认为 Select2 对 mouseup 事件的处理会阻止.info元素获得单击事件。让.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

于 2014-11-27T18:29:13.077 回答
2

只需添加 'open' 监听器并为 '' 标签设置另一个 'mouseup' 监听器:

$("#select").on('open', function() { 
    $('.select2-results i').on('mouseup', function() { 
       alert('aaa');
    }); 
});

这是我的解决方案的链接:http: //jsfiddle.net/EW8t7/

于 2013-03-26T12:56:39.280 回答
1

事情似乎是在盒子关闭后tgas将被删除。因此无法触发 click 事件。

我已经更改了一些内容 + 将被监听的事件。现在是鼠标按下...

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>

于 2013-03-26T12:40:05.693 回答
1

刚刚使用 select2 v4.0.3 遇到了这个问题,最终使用了“select2:selecting”事件。这基本上是我的做法:

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)
  });
});

于 2018-07-20T22:36:52.240 回答
0

您需要从 .select2-results__options 元素中取消绑定 mouseup 事件。我在我的 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;
于 2015-07-08T17:34:23.183 回答
0

像这样的简单 onchange 事件也有助于解决问题

<select id="GetClientAccounts" class="default-select2 form-control col-md-4" onchange="GetClientAccounts();">
    <option disabled selected value="-1">Select a customer from here</option>
    @{
        if (ViewBag.customers != null)
        {
            foreach (CustomerTBL customer in ((List<CustomerTBL>)ViewBag.customers).OrderBy(c => c.cusCustomerName))
            {
                <option value="@customer.cusCustomerID">@customer.cusCustomerName</option>
            }
        }
    }
</select>
于 2020-03-06T08:46:06.923 回答