瀏覽代碼

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 年之前
父節點
當前提交
481c43883e
共有 2 個文件被更改,包括 17 次插入4 次删除
  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;
       return;
     }
     }
 
 
-    this.trigger('close', {});
+    this.trigger('close', {
+      originalEvent: originalEvent,
+      originalSelect2Event: evt
+    });
   };
   };
 
 
   return CloseOnSelect;
   return CloseOnSelect;

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

@@ -8,12 +8,22 @@ define([
 
 
     decorated.call(this, container, $container);
     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();
     var $highlightedResults = this.getHighlightedResults();
 
 
     // Only select highlighted results
     // Only select highlighted results