クリックイベントをselect2-result-itemにアタッチする方法を探しています。先に進み、結果と選択の両方をフォーマットしました
function format(state) {
if (!state.id) return state.text; // optgroup
return state.text + " <i class='info'>link</i>";
}
「情報」アイコンを追加するには、単純なクリックイベントを.info要素に添付しようとしていますが、これを機能させることはできません。
$('.info').on('click', function(event){
event.preventDefault();
alert("CLICK");
$('#log').text( "clicked" );
});
助けがありますか?同様の問題を抱えている人はいますか?これはまったく可能ですか?
次の場所でjsFiddleを準備しました: http://jsfiddle.net/s2dqh/3/
Select2 libはポップオーバーリストのクリックイベントを防ぐため、イベントを.info
に直接バインドすることはできません。ただし、onSelect
メソッドを再定義して、必要なコードをそこに配置できます。
例を参照してください: http://jsfiddle.net/f8q2by55/
複数選択の更新: http://jsfiddle.net/6jaodjzq/
これはnetmeの概念と似ていますが、select2イベントが間違っている(バージョンの違いが考えられる)ため、stopPropagationを使用してアイテムが選択されないようにする必要があります。
$('#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');
});
});
});
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>
この例では、ブラウザーがmouseup
イベントをトリガーするように、click
イベントの伝搬を停止します。実際のリンクを使用していないが、代わりにclick
イベントをキャッチする必要がある場合は、mouseup
イベントにフックするだけです。
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
}
'open'リスナーを追加し、 ''タグ用に別の 'mouseup'リスナーを設定するだけです:
$("#select").on('open', function() {
$('.select2-results i').on('mouseup', function() {
alert('aaa');
});
});
ここに私のソリューションへのリンクがあります: http://jsfiddle.net/EW8t7/
ドキュメントによると、よりシンプルなアプローチ。
$('#mySelect2').on('select2:select', function (e) {
var data = e.params.data;
console.log(data);
});
これに対する答えが表示されないことに驚いた。
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イベントです。
他のjqueryイベントを使用する代わりに、デフォルトのselect2selectイベントトリガーを使用する
$('#mySelect2').on('select2:select', function (e) {
var data = e.params.data;
console.log(data);
});
詳細については、以下のリンクを参照してください https://select2.org/programmatic-control/events
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)
});
});
問題は、ボックスが閉じられた直後にtgasが削除されることです。したがって、クリックイベントを発生させることはできません。
いくつかの点と、リッスンするイベントを変更しました。これはマウスダウンです...
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>
.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;