My following JS solution is better than the other approaches here because it ensures that it will always say 'open' when the target is closed, and vice versa.
HTML:
<a href="#collapseExample" class="btn btn-primary" data-toggle="collapse" data-toggle-secondary="Close">
Open
</a>
<div class="collapse" id="collapseExample">
<div class="well">
...
</div>
</div>
JS:
$('[data-toggle-secondary]').each(function() {
var $toggle = $(this);
var originalText = $toggle.text();
var secondaryText = $toggle.data('toggle-secondary');
var $target = $($toggle.attr('href'));
$target.on('show.bs.collapse hide.bs.collapse', function() {
if ($toggle.text() == originalText) {
$toggle.text(secondaryText);
} else {
$toggle.text(originalText);
}
});
});
$('[data-toggle-secondary]').each(function() {_x000D_
var $toggle = $(this);_x000D_
var originalText = $toggle.text();_x000D_
var secondaryText = $toggle.data('toggle-secondary');_x000D_
var $target = $($toggle.attr('href'));_x000D_
_x000D_
$target.on('show.bs.collapse hide.bs.collapse', function() {_x000D_
if ($toggle.text() == originalText) {_x000D_
$toggle.text(secondaryText);_x000D_
} else {_x000D_
$toggle.text(originalText);_x000D_
}_x000D_
});_x000D_
});
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_x000D_
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet"/>_x000D_
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>_x000D_
_x000D_
<a href="#collapseExample" class="btn btn-primary" data-toggle="collapse" data-toggle-secondary="Close">_x000D_
Open_x000D_
</a>_x000D_
<div class="collapse" id="collapseExample">_x000D_
<div class="well">_x000D_
..._x000D_
</div>_x000D_
</div>
_x000D_
data-toggle-secondary
attribute