Skip to content

Commit

Permalink
Implement hide and hidden events for tabs
Browse files Browse the repository at this point in the history
Closes #14772.
  • Loading branch information
Phil Hughes authored and hnrch02 committed Oct 22, 2014
1 parent 40c309b commit ab8dbc2
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 6 deletions.
8 changes: 8 additions & 0 deletions docs/_includes/js/tabs.html
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,14 @@ <h3>Events</h3>
<td>shown.bs.tab</td>
<td>This event fires on tab show after a tab has been shown. Use <code>event.target</code> and <code>event.relatedTarget</code> to target the active tab and the previous active tab (if available) respectively.</td>
</tr>
<tr>
<td>hide.bs.tab</td>
<td>This event fires immediately when a new tab is to be shown and before the <code>show.bs.tab</code> event. Use <code>event.relatedTarget</code> to target the new tab.</td>
</tr>
<tr>
<td>hidden.bs.tab</td>
<td>This event fires after a new tab is shown and before the <code>shown.bs.tab</code> event. Use <code>event.relatedTarget</code> to target the new tab.</td>
</tr>
</tbody>
</table>
</div><!-- /.table-responsive -->
Expand Down
20 changes: 14 additions & 6 deletions js/tab.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,30 @@

if ($this.parent('li').hasClass('active')) return

var previous = $ul.find('.active:last a')[0]
var e = $.Event('show.bs.tab', {
relatedTarget: previous
var $previous = $ul.find('.active:last a')
var hideEvent = $.Event('hide.bs.tab', {
relatedTarget: $this[0]
})
var showEvent = $.Event('show.bs.tab', {
relatedTarget: $previous[0]
})

$this.trigger(e)
$previous.trigger(hideEvent)
$this.trigger(showEvent)

if (e.isDefaultPrevented()) return
if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return

var $target = $(selector)

this.activate($this.closest('li'), $ul)
this.activate($target, $target.parent(), function () {
$previous.trigger({
type: 'hidden.bs.tab',
relatedTarget: $this[0]
})
$this.trigger({
type: 'shown.bs.tab',
relatedTarget: previous
relatedTarget: $previous[0]
})
})
}
Expand Down
77 changes: 77 additions & 0 deletions js/tests/unit/tab.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,81 @@ $(function () {
.bootstrapTab('show')
})

test('should fire hide and hidden events', function () {
stop()

var tabsHTML = '<ul class="tabs">'
+ '<li><a href="#home">Home</a></li>'
+ '<li><a href="#profile">Profile</a></li>'
+ '</ul>'

$(tabsHTML)
.find('li:first a')
.on('hide.bs.tab', function () {
ok(true, 'hide event fired')
})
.bootstrapTab('show')
.end()
.find('li:last a')
.bootstrapTab('show')

$(tabsHTML)
.find('li:first a')
.on('hidden.bs.tab', function () {
ok(true, 'hidden event fired')
start()
})
.bootstrapTab('show')
.end()
.find('li:last a')
.bootstrapTab('show')
})

test('should not fire hidden when hide is prevented', function () {
stop()

var tabsHTML = '<ul class="tabs">'
+ '<li><a href="#home">Home</a></li>'
+ '<li><a href="#profile">Profile</a></li>'
+ '</ul>'

$(tabsHTML)
.find('li:first a')
.on('hide.bs.tab', function (e) {
e.preventDefault()
ok(true, 'hide event fired')
start()
})
.on('hidden.bs.tab', function () {
ok(false, 'hidden event fired')
})
.bootstrapTab('show')
.end()
.find('li:last a')
.bootstrapTab('show')
})

test('hide and hidden events contain correct relatedTarget', function () {
stop()

var tabsHTML = '<ul class="tabs">'
+ '<li><a href="#home">Home</a></li>'
+ '<li><a href="#profile">Profile</a></li>'
+ '</ul>'

$(tabsHTML)
.find('li:first a')
.on('hide.bs.tab', function (e) {
equal(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
})
.on('hidden.bs.tab', function (e) {
equal(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
start()
})
.bootstrapTab('show')
.end()
.find('li:last a')
.bootstrapTab('show')
})

})

0 comments on commit ab8dbc2

Please sign in to comment.