将点击事件附加到 .select2-result 中的元素

IT技术 javascript jquery-select2
2021-02-06 18:41:00

我正在寻找一种将点击事件附加到 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/

6个回答

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

参见示例:http : //jsfiddle.net/f8q2by55/

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

@ant_Ti - 非常感谢您的快速回答(就像一个魅力!),在这里真的学到了很多!请允许我再问一个问题:如何将修改后的“onSelect”应用于 select2 的其他实例?
2021-03-17 18:41:00
太棒了,到目前为止,谢谢;我知道这超出了我最初的问题,但是我如何使 .select2-choice 中的链接继承相同的行为?(澄清:.select2-choice 是被选中的元素 - jsfiddle 显示点击事件仅适用于下拉选项,而不适用于当前选择的元素)
2021-03-21 18:41:00
@brckmann 看到我的更新来回答。对您的代码进行一点重构
2021-04-03 18:41:00
@ant_Ti - 我在“肮脏的黑客”(select2-dropdown 未关闭等)方面遇到了太多问题,所以我继续为 .select2-choice 的信息图标实施了一个解决方法,它可以完成它需要的操作不干扰 select2 的原始功能。请允许我再问一个关于第一个解决方案(覆盖“onSelect”)的问题:我注意到在通过返回键进行选择时,这会导致“未捕获的类型错误:无法读取未定义的属性‘目标’” - 任何线索如何抓住最后的烦恼?
2021-04-08 18:41:00
我忘了补充,每个 select2-instances 都有不同的选项。很高兴为此提出另一个问题!
2021-04-12 18:41:00

这与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 并且您可以连接到它的打开功能时。

$('#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');
        }); 
    });
});
+1通用部分为$('#mySelect2').on('select2-open', function() { 我节省了根据需要构建自定义代码的时间。
2021-04-10 18:41:00
@MichelAyres 的答案是这里唯一对我有用的东西。
2021-04-11 18:41:00

对于 4.0.0 之前的 Select2 版本(因此是 3.5.x 及以下),您应该参考有关绑定到onSelect.

在较新版本的 Select2 中,事件不再在结果中被杀死,因此您可以mouseupmousedown像往常一样绑定到/事件您应该避免绑定到该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事件。

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

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

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

对于 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
}
如果可以,请提供 JSfiddle 或其他东西来证明您的方法有效。这里有太多答案不适用于新版本的 select2。
2021-04-08 18:41:00