Autor wpisu: Marek, dodany: 29.08.2013 23:56, tagi: javascript, php
Twitter Bootstrap z gałęzi 2.3.x oferuje proste boksy, tzw. popovers (http://getbootstrap.com/2.3.2/javascript.html#popovers), których możemy używać do wyświetlania w całkiem ładny sposób różnych informacji. Podstawowa funkcjonalność tych elementów jednak nie była dla mnie wystarczająca.
Co chciałem uzyskać:
- tylko jeden aktywny boks na stronie,
- otwierany po kliknięciu,
- zamykany po ponownym kliknięciu gdziekolwiek poza aktywnym boksem (tak żeby można było skopiować zawartą w nim informację)
Poniżej kod, który dostosowuje popovers zgodnie z powyższymi założeniami:
// zniszcz otwarte boksy
function destroyOpenedPopovers() {
//jeśli obiekt, z którego wywołaliśmy boks, posiada id, niszczymy jego boks
if ($('#closingDiv').length && $('#closingDiv').attr('data-popover-id') !== 'undefined') {
var popoverLinkId = $('#closingDiv').attr('data-popover-id');
$('#' + popoverLinkId).popover('destroy');
$('#' + popoverLinkId).removeClass('popover-active');
} else {
// w przeciwnym razie niszczymy wszystkie możliwie otwarte boksy
$('.popover-area').each(function () {
$(this).popover('destroy');
$(this).removeClass('popover-active');
});
}
}
//uruchamiamy popover
function triggerPopover(obj) {
// klasa popover-active nadawana jest obiektowi, na którym otwieramy boks
$(obj).toggleClass('popover-active');
// jeśli boks powinien zostać otwarty
if ($(obj).hasClass('popover-active')) {
$(obj).popover({
html: true,
trigger: 'manual'
});
$(obj).popover('show');
// obszar zamykający otwarty boks
var closingDiv = '<div id="closingDiv" style="z-index: 1008; background-color: rgba(0, 0, 0, 0.1); width:' + $(document).width() + 'px; height: ' + $(document).height() + 'px; position: absolute; top: 0; left: 0;" data-popover-id="' + $(obj).attr('id') + '"></div>';
$('body').append(closingDiv);
$('#closingDiv').click(function () {
destroyOpenedPopovers();
$(this).remove()
});
}
}
$(document).ready(function () {
$('.popover-area').click(function () {
triggerPopover(this);
});
});
Kilka słów komentarza:
- w powyższym przykładzie do każdego elementu drzewa DOM, który posiada klasę „popover-area” podpinam funkcję, która utworzy boks
- w momencie wywołania popover, nadaję elementowi wywołującemu boks klasę popover-active oraz tworzę zamykający obszar, który rozciągam na cały ekran
- zamykający obszar posiada atrybut data-popover-id, którego wartość to id elementu, którego kliknięcie wywołało utworzenie boksa – dzięki temu wiemy co trzeba zamknąć
Przykład użycia: http://jsfiddle.net/mheki/Dg8Z8/
Kanał ATOM
