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/