2015-04-14 10 views
6

Scheint, dass Select2 4 standardmäßig das Dropdown-Menü öffnet, wenn das aktuell ausgewählte Element gelöscht wird. Frühere Versionen von select2 schienen dieses Verhalten nicht zu haben und ich versuche es zu erreichen, aber momentan kein Glück.Deaktivierung der Dropdown-Öffnung bei Select2 Clear

Kann jemand in das Clear-Ereignis einhaken, damit wir das Standardverhalten deaktivieren und die ausgewählte Option löschen können, ohne das Dropdown-Menü zu öffnen?

Cheers, Al

+0

Unter der Annahme, dass dies ein Einzel wählen ist, können Sie 'preventDefault' auf dem' select2: closing' Ereignis, das Recht ausgelöst wird nach 'select2: unselect'. Zu einem anderen Zeitpunkt kann ich eine vollständigere Antwort schreiben. –

+0

Danke Kevin, ich hatte einen Versuch, aber ich bekomme den Fehler "Kann Eigenschaft nicht 'verhindert' von undefiniert", wenn preventDefault auf select2: closing. Ich habe eine schnelle Geige unter http://jsfiddle.net/r56zh872/ zusammengestellt, jede Hilfe wird geschätzt. – Alberto

+0

@KevinBrown Gibt es ein Upstream-Problem, das für diese Situation erstellt wurde? –

Antwort

9

Kann bestätigen, scheint Ereignisse verhindern nicht aus irgendeinem Grunde zu arbeiten, so dass Sie nur die Drop-down nach einigen Timeout schließen können:

$("select").select2({ 
    allowClear: true 
}).on("select2:unselecting", function(e) { 
    $(this).data('state', 'unselected'); 
}).on("select2:open", function(e) { 
    if ($(this).data('state') === 'unselected') { 
     $(this).removeData('state'); 

     var self = $(this); 
     setTimeout(function() { 
      self.select2('close'); 
     }, 1); 
    }  
}); 

Hier ist eine Arbeits Geige: http://jsfiddle.net/obq3yLf2/

+0

Prost Sam. Guter Workaround, bis das Vorbeugungsproblem gelöst ist. – Alberto

+0

Es ist besser die zweite Lösung, ohne timeOut – naxo8628

19

Sie brauchen keinen Timeout benötigen diese Arbeit zu machen, hier ist mein Beispiel:

$('#my-select').select2({ 
    allowClear: true 
}).on('select2:unselecting', function() { 
    $(this).data('unselecting', true); 
}).on('select2:opening', function(e) { 
    if ($(this).data('unselecting')) { 
     $(this).removeData('unselecting'); 
     e.preventDefault(); 
    } 
}); 
+2

Beispiel: http://jsfiddle.net/obq3yLf2/14/ –

+1

So viel besser, danke – DoubleYo

+0

Was passiert, wenn ich mehrere select2 in einer Seite habe? –

0

Eine weitere einfache Implementierung:

   $('select').on('select2:unselect', function(evt) { 
      $(this).select2({ 
       placeholder : { 
        id : '', 
        text : '---None Selected---' 
       }, 
       allowClear : true, 
       theme : "bootstrap" 
      }).select2('close'); 

     }); 
0

hatte ich ein Problem mit einer kurzen Verzögerung nach einem der Punkte Abwählen und diese Lösung dieser Frage für mich festgelegt:

$(this).select2({ 
    multiple: 'multiple', 
}).on("select2:unselecting", function(e) { 
    var self = $(this); 
    setTimeout(function() { 
     self.select2('close'); 
    }, 0); 
}); 
1

Bitte bei Github beziehen für gleiche .

Prevent select2:open when clearing selection

Von dort habe ich die gegebenen Antworten aufgeführt.

1 Option

$('#select-id').on('select2:unselecting', function() { 
    var opts = $(this).data('select2').options; 
    opts.set('disabled', true); 
    setTimeout(function() { 
     opts.set('disabled', false); 
    }, 1); 
}); 

2 Option

var $el = $('#select-id'); 
$el.on('select2:unselecting', function(e) { 
    $el.data('unselecting', true); 
}).on('select2:open', function(e) { // note the open event is important 
    if ($el.data('unselecting')) {  
     $el.removeData('unselecting'); // you need to unset this before close 
     $el.select2('close'); 
    } 
});