util.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. (function (global, factory) {
  2. if (typeof define === 'function' && define.amd) {
  3. define(['exports', 'module'], factory);
  4. } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
  5. factory(exports, module);
  6. } else {
  7. var mod = {
  8. exports: {}
  9. };
  10. factory(mod.exports, mod);
  11. global.util = mod.exports;
  12. }
  13. })(this, function (exports, module) {
  14. /**
  15. * --------------------------------------------------------------------------
  16. * Bootstrap (v4.0.0): util.js
  17. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  18. * --------------------------------------------------------------------------
  19. */
  20. 'use strict';
  21. var Util = (function ($) {
  22. /**
  23. * ------------------------------------------------------------------------
  24. * Private TransitionEnd Helpers
  25. * ------------------------------------------------------------------------
  26. */
  27. var transition = false;
  28. var TransitionEndEvent = {
  29. WebkitTransition: 'webkitTransitionEnd',
  30. MozTransition: 'transitionend',
  31. OTransition: 'oTransitionEnd otransitionend',
  32. transition: 'transitionend'
  33. };
  34. // shoutout AngusCroll (https://goo.gl/pxwQGp)
  35. function toType(obj) {
  36. return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
  37. }
  38. function isElement(obj) {
  39. return (obj[0] || obj).nodeType;
  40. }
  41. function getSpecialTransitionEndEvent() {
  42. return {
  43. bindType: transition.end,
  44. delegateType: transition.end,
  45. handle: function handle(event) {
  46. if ($(event.target).is(this)) {
  47. return event.handleObj.handler.apply(this, arguments);
  48. }
  49. }
  50. };
  51. }
  52. function transitionEndTest() {
  53. if (window.QUnit) {
  54. return false;
  55. }
  56. var el = document.createElement('bootstrap');
  57. for (var _name in TransitionEndEvent) {
  58. if (el.style[_name] !== undefined) {
  59. return { end: TransitionEndEvent[_name] };
  60. }
  61. }
  62. return false;
  63. }
  64. function transitionEndEmulator(duration) {
  65. var _this = this;
  66. var called = false;
  67. $(this).one(Util.TRANSITION_END, function () {
  68. called = true;
  69. });
  70. setTimeout(function () {
  71. if (!called) {
  72. Util.triggerTransitionEnd(_this);
  73. }
  74. }, duration);
  75. return this;
  76. }
  77. function setTransitionEndSupport() {
  78. transition = transitionEndTest();
  79. $.fn.emulateTransitionEnd = transitionEndEmulator;
  80. if (Util.supportsTransitionEnd()) {
  81. $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
  82. }
  83. }
  84. /**
  85. * --------------------------------------------------------------------------
  86. * Public Util Api
  87. * --------------------------------------------------------------------------
  88. */
  89. var Util = {
  90. TRANSITION_END: 'bsTransitionEnd',
  91. getUID: function getUID(prefix) {
  92. do {
  93. prefix += ~ ~(Math.random() * 1000000);
  94. } while (document.getElementById(prefix));
  95. return prefix;
  96. },
  97. getSelectorFromElement: function getSelectorFromElement(element) {
  98. var selector = element.getAttribute('data-target');
  99. if (!selector) {
  100. selector = element.getAttribute('href') || '';
  101. selector = /^#[a-z]/i.test(selector) ? selector : null;
  102. }
  103. return selector;
  104. },
  105. reflow: function reflow(element) {
  106. new Function('bs', 'return bs')(element.offsetHeight);
  107. },
  108. triggerTransitionEnd: function triggerTransitionEnd(element) {
  109. $(element).trigger(transition.end);
  110. },
  111. supportsTransitionEnd: function supportsTransitionEnd() {
  112. return Boolean(transition);
  113. },
  114. typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
  115. for (var property in configTypes) {
  116. if (configTypes.hasOwnProperty(property)) {
  117. var expectedTypes = configTypes[property];
  118. var value = config[property];
  119. var valueType = undefined;
  120. if (value && isElement(value)) {
  121. valueType = 'element';
  122. } else {
  123. valueType = toType(value);
  124. }
  125. if (!new RegExp(expectedTypes).test(valueType)) {
  126. throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
  127. }
  128. }
  129. }
  130. }
  131. };
  132. setTransitionEndSupport();
  133. return Util;
  134. })(jQuery);
  135. module.exports = Util;
  136. });