JSDoc: Source: noop.tooltip.js

  1. /**
  2. * NOOP Tooltip module.
  3. * @memberof noop
  4. * @namespace tooltip
  5. * @author cisco211
  6. * @copyright © 2019 by "cisco211"
  7. * @version 0.200
  8. */
  9. (function(noop, undefined)
  10. {
  11. 'use strict';
  12. // #region Private
  13. /**
  14. * @summary Default tooltip options.
  15. * @typedef {object.<string, any>} noop.tooltip.Defaults
  16. * @memberof noop.tooltip
  17. * @property {string} [attr='noop-tooltip'] - Default data attribute name.
  18. * @property {string} [edgeH=10] - Default viewport horizontal edge offset.
  19. * @property {string} [edgeV=10] - Default viewport vertical edge offset.
  20. * @property {string} [offsetX=10] - Default mouse x offset.
  21. * @property {string} [offsetY=10] - Default mouse y offset.
  22. */
  23. class Defaults
  24. {
  25. constructor()
  26. {
  27. this.attr = 'noop-tooltip';
  28. this.edgeH = 10;
  29. this.edgeV = 10;
  30. this.offsetX = 25;
  31. this.offsetY = 25;
  32. }
  33. }; // class Defaults
  34. var current_ = null;
  35. var edgeH_ = Defaults.edgeH;
  36. var edgeV_ = Defaults.edgeV;
  37. var offsetX_ = Defaults.offsetX;
  38. var offsetY_ = Defaults.offsetY;
  39. var attrToIndex_ = function(a)
  40. {
  41. return a.replace(/-([a-z]{1})/, function($0, $1)
  42. {
  43. return $0.replace('-', '').replace($1, $1.toUpperCase());
  44. });
  45. };
  46. var ttShow_ = function(tt, eventMouse)
  47. {
  48. ttMove_(tt, eventMouse)
  49. };
  50. var ttHide_ = function(tt)
  51. {
  52. if (noop.isNull(tt))
  53. return;
  54. current_ = null;
  55. tt.style.display = 'none';
  56. };
  57. var ttMove_ = function(tt, eventMouse)
  58. {
  59. if (noop.isNull(tt) || noop.isNull(eventMouse))
  60. return;
  61. current_ = tt;
  62. tt.style.display = 'block';
  63. tt.style.left = (eventMouse.clientX + offsetX_) + 'px';
  64. tt.style.top = (eventMouse.clientY + offsetY_) + 'px';
  65. if (!window || !window.getComputedStyle)
  66. return;
  67. var c = window.getComputedStyle(tt);
  68. var ttHeight = parseInt(c.height.replace('px', ''));
  69. var ttWidth = parseInt(c.width.replace('px', ''));
  70. if (eventMouse.clientX + offsetX_+ ttWidth >= document.documentElement.clientWidth - edgeH_)
  71. tt.style.left = (eventMouse.clientX - offsetX_ - ttWidth) + 'px';
  72. if (eventMouse.clientY + offsetY_ + ttHeight >= document.documentElement.clientHeight - edgeV_)
  73. tt.style.top = (eventMouse.clientY - offsetY_ - ttHeight) + 'px';
  74. };
  75. var scroll_ = function()
  76. {
  77. if (noop.isNull(current_))
  78. return;
  79. ttHide_(current_);
  80. }
  81. var touchEnd_ = function(opts, eventTouch)
  82. {
  83. var a = attrToIndex_(opts.attr);
  84. if (!noop.isNull(eventTouch.target.dataset[a]))
  85. return;
  86. if (noop.isNull(current_))
  87. return;
  88. ttHide_(current_);
  89. };
  90. // #endregion Private
  91. // #region Public
  92. noop.tooltip = new class Tooltip
  93. {
  94. constructor()
  95. {
  96. this.defaults = function()
  97. {
  98. return new Defaults();
  99. };
  100. this.register = function(opts = noop.tooltip.defaults())
  101. {
  102. var a = attrToIndex_(opts.attr);
  103. edgeH_ = noop.isSet(opts.edgeH) ? opts.edgeH : edgeH_;
  104. edgeV_ = noop.isSet(opts.edgeV) ? opts.edgeV : edgeV_;
  105. offsetX_ = noop.isSet(opts.offsetX) ? opts.offsetX : offsetX_;
  106. offsetY_ = noop.isSet(opts.offsetY) ? opts.offsetY : offsetY_;
  107. var l = document.querySelectorAll('[data-' + opts.attr + ']');
  108. if (l)
  109. {
  110. l.forEach(function(e)
  111. {
  112. var tt = document.getElementById(e.dataset[a]);
  113. if (tt)
  114. {
  115. e.addEventListener('mouseenter', function(eventMouse){ttShow_(tt, eventMouse);}, false);
  116. e.addEventListener('mouseleave', function(){ttHide_(tt);}, false);
  117. e.addEventListener('mousemove', function(eventMouse){ttMove_(tt, eventMouse);}, false);
  118. }
  119. }); // l.forEach(function(e)
  120. document.documentElement.addEventListener('touchend', function(eventTouch){touchEnd_(opts, eventTouch);}, false);
  121. window.addEventListener('scroll', function(){scroll_();}, false);
  122. } // if (l)
  123. }; // register = function(opts = noop.tooltip.defaults())
  124. }
  125. }; // noop.tooltip = new class Tooltip
  126. // #endregion Public
  127. } // (function(noop, undefined)
  128. (window.noop = window.noop || new class NOOP{}));
  129. // EOF