popovers.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* ========================================================================
  2. * Ratchet: popovers.js v2.0.2
  3. * http://goratchet.com/components#popovers
  4. * ========================================================================
  5. * Copyright 2014 Connor Sears
  6. * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE)
  7. * ======================================================================== */
  8. !(function () {
  9. 'use strict';
  10. var popover;
  11. var findPopovers = function (target) {
  12. var i;
  13. var popovers = document.querySelectorAll('a');
  14. for (; target && target !== document; target = target.parentNode) {
  15. for (i = popovers.length; i--;) {
  16. if (popovers[i] === target) {
  17. return target;
  18. }
  19. }
  20. }
  21. };
  22. var onPopoverHidden = function () {
  23. popover.style.display = 'none';
  24. popover.removeEventListener('webkitTransitionEnd', onPopoverHidden);
  25. };
  26. var backdrop = (function () {
  27. var element = document.createElement('div');
  28. element.classList.add('backdrop');
  29. element.addEventListener('touchend', function () {
  30. popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
  31. popover.classList.remove('visible');
  32. popover.parentNode.removeChild(backdrop);
  33. });
  34. return element;
  35. }());
  36. var getPopover = function (e) {
  37. var anchor = findPopovers(e.target);
  38. if (!anchor || !anchor.hash || (anchor.hash.indexOf('/') > 0)) {
  39. return;
  40. }
  41. try {
  42. popover = document.querySelector(anchor.hash);
  43. }
  44. catch (error) {
  45. popover = null;
  46. }
  47. if (popover === null) {
  48. return;
  49. }
  50. if (!popover || !popover.classList.contains('popover')) {
  51. return;
  52. }
  53. return popover;
  54. };
  55. var showHidePopover = function (e) {
  56. var popover = getPopover(e);
  57. if (!popover) {
  58. return;
  59. }
  60. popover.style.display = 'block';
  61. popover.offsetHeight;
  62. popover.classList.add('visible');
  63. popover.parentNode.appendChild(backdrop);
  64. };
  65. window.addEventListener('touchend', showHidePopover);
  66. }());