Browse Source

selectOnClose now properly works with closeOnSelect

Previously we hacked around the infinite loop between closeOnSelect and
selectOnClose by attempting to detect what event was being triggered
without knowing what event triggered it. Now we properly relay the
Select2 event and the jQuery event that triggered the select or unselect

This closes https://github.com/select2/select2/issues/4012
Kevin Brown 9 years ago
parent
commit
481c43883e
2 changed files with 17 additions and 4 deletions
  1. 4 1
      src/js/select2/dropdown/closeOnSelect.js
  2. 13 3
      src/js/select2/dropdown/selectOnClose.js

+ 4 - 1
src/js/select2/dropdown/closeOnSelect.js

@@ -25,7 +25,10 @@ define([
       return;
     }
 
-    this.trigger('close', {});
+    this.trigger('close', {
+      originalEvent: originalEvent,
+      originalSelect2Event: evt
+    });
   };
 
   return CloseOnSelect;

+ 13 - 3
src/js/select2/dropdown/selectOnClose.js

@@ -8,12 +8,22 @@ define([
 
     decorated.call(this, container, $container);
 
-    container.on('close', function () {
-      self._handleSelectOnClose();
+    container.on('close', function (params) {
+      self._handleSelectOnClose(params);
     });
   };
 
-  SelectOnClose.prototype._handleSelectOnClose = function () {
+  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
+    if (params && params.originalSelect2Event != null) {
+      var event = params.originalSelect2Event;
+
+      // Don't select an item if the close event was triggered from a select or
+      // unselect event
+      if (event._type === 'select' || event._type === 'unselect') {
+        return;
+      }
+    }
+
     var $highlightedResults = this.getHighlightedResults();
 
     // Only select highlighted results