]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Don't fire show event if show is prevented because other element is still transitioning
authorHeinrich Fenkart <hnrch02@gmail.com>
Wed, 22 Oct 2014 01:49:03 +0000 (03:49 +0200)
committerHeinrich Fenkart <hnrch02@gmail.com>
Wed, 22 Oct 2014 02:25:05 +0000 (04:25 +0200)
Fixes #14844.
Closes #14845.

js/collapse.js
js/tests/unit/collapse.js

index d7d56bdd5ee2b86fbab45c99dd156c39831f1bfb..abbf25f2a6a7e66798acbd7c29fd5d6d10cf4b75 100644 (file)
   Collapse.prototype.show = function () {
     if (this.transitioning || this.$element.hasClass('in')) return
 
+    var activesData
+    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
     var startEvent = $.Event('show.bs.collapse')
     this.$element.trigger(startEvent)
     if (startEvent.isDefaultPrevented()) return
 
-    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
-
     if (actives && actives.length) {
-      var hasData = actives.data('bs.collapse')
-      if (hasData && hasData.transitioning) return
       Plugin.call(actives, 'hide')
-      hasData || actives.data('bs.collapse', null)
+      activesData || actives.data('bs.collapse', null)
     }
 
     var dimension = this.dimension()
index 825f79360e9f5b0733f04c4d8ad893b07b087780..c1d78575c6ba525b6eb6530627c2847dd7f8f1b8 100644 (file)
@@ -263,4 +263,39 @@ $(function () {
     $target3.click()
   })
 
+  test('should not fire show event if show is prevented because other element is still transitioning', function () {
+    stop()
+
+    var accordionHTML = '<div id="accordion">'
+        + '<div class="panel"/>'
+        + '<div class="panel"/>'
+        + '</div>'
+    var showFired = false
+    var $groups   = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
+
+    var $target1 = $('<a data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
+
+    $('<div id="body1" class="collapse"/>')
+      .appendTo($groups.eq(0))
+      .on('show.bs.collapse', function () {
+        showFired = true
+      })
+
+    var $target2 = $('<a data-toggle="collapse" href="#body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
+    var $body2   = $('<div id="body2" class="collapse"/>').appendTo($groups.eq(1))
+
+    $target2.click()
+
+    $body2
+      .toggleClass('in collapsing')
+      .data('bs.collapse').transitioning = 1
+
+    $target1.click()
+
+    setTimeout(function () {
+      ok(!showFired, 'show event didn\'t fire')
+      start()
+    }, 1)
+  })
+
 })