util.js 4.54 KB
Newer Older
fat's avatar
fat committed
1
2
/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
3
 * Bootstrap (v4.0.0-beta.2): util.js
fat's avatar
fat committed
4
5
6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */
Mark Otto's avatar
dist    
Mark Otto committed
7
var Util = function ($) {
8
9
10
11
12
13
  /**
   * ------------------------------------------------------------------------
   * Private TransitionEnd Helpers
   * ------------------------------------------------------------------------
   */
  var transition = false;
Chris Rebert's avatar
grunt    
Chris Rebert committed
14
  var MAX_UID = 1000000;
15
16
  var TransitionEndEvent = {
    WebkitTransition: 'webkitTransitionEnd',
Mark Otto's avatar
dist    
Mark Otto committed
17
    transition: 'transitionend' // shoutout AngusCroll (https://goo.gl/pxwQGp)
18

Mark Otto's avatar
dist    
Mark Otto committed
19
  };
fat's avatar
fat committed
20

Mark Otto's avatar
dist    
Mark Otto committed
21
22
  function toType(obj) {
    return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
fat's avatar
fat committed
23
24
  }

25
26
27
28
29
30
  function getSpecialTransitionEndEvent() {
    return {
      bindType: transition.end,
      delegateType: transition.end,
      handle: function handle(event) {
        if ($(event.target).is(this)) {
Mark Otto's avatar
Mark Otto committed
31
          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
32
        }
Mark Otto's avatar
dist    
Mark Otto committed
33

Mark Otto's avatar
dist    
Mark Otto committed
34
        return undefined; // eslint-disable-line no-undefined
35
36
37
      }
    };
  }
fat's avatar
fat committed
38

39
40
41
  function transitionEndTest() {
    if (window.QUnit) {
      return false;
fat's avatar
fat committed
42
43
    }

44
    var el = document.createElement('bootstrap');
fat's avatar
fat committed
45

Mark Otto's avatar
grunt    
Mark Otto committed
46
    for (var name in TransitionEndEvent) {
Mark Otto's avatar
dist    
Mark Otto committed
47
      if (typeof el.style[name] !== 'undefined') {
Mark Otto's avatar
grunt    
Mark Otto committed
48
49
50
        return {
          end: TransitionEndEvent[name]
        };
51
52
      }
    }
fat's avatar
fat committed
53

54
    return false;
fat's avatar
fat committed
55
56
  }

57
58
  function transitionEndEmulator(duration) {
    var _this = this;
fat's avatar
fat committed
59

60
61
62
63
64
65
    var called = false;
    $(this).one(Util.TRANSITION_END, function () {
      called = true;
    });
    setTimeout(function () {
      if (!called) {
fat's avatar
fat committed
66
        Util.triggerTransitionEnd(_this);
fat's avatar
fat committed
67
      }
68
69
    }, duration);
    return this;
fat's avatar
fat committed
70
71
  }

72
73
74
75
76
77
  function setTransitionEndSupport() {
    transition = transitionEndTest();
    $.fn.emulateTransitionEnd = transitionEndEmulator;

    if (Util.supportsTransitionEnd()) {
      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
fat's avatar
fat committed
78
79
    }
  }
Mark Otto's avatar
Mark Otto committed
80
81
82
83
84
85
86

  function escapeId(selector) {
    // we escape IDs in case of special selectors (selector = '#myId:something')
    // $.escapeSelector does not exist in jQuery < 3
    selector = typeof $.escapeSelector === 'function' ? $.escapeSelector(selector).substr(1) : selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1');
    return selector;
  }
87
88
89
90
91
  /**
   * --------------------------------------------------------------------------
   * Public Util Api
   * --------------------------------------------------------------------------
   */
fat's avatar
fat committed
92
93


Mark Otto's avatar
dist    
Mark Otto committed
94
  var Util = {
95
96
    TRANSITION_END: 'bsTransitionEnd',
    getUID: function getUID(prefix) {
Mark Otto's avatar
Mark Otto committed
97
      do {
Mark Otto's avatar
grunt    
Mark Otto committed
98
        // eslint-disable-next-line no-bitwise
Mark Otto's avatar
grunt    
Mark Otto committed
99
        prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
Mark Otto's avatar
Mark Otto committed
100
      } while (document.getElementById(prefix));
Mark Otto's avatar
dist    
Mark Otto committed
101

102
103
104
105
      return prefix;
    },
    getSelectorFromElement: function getSelectorFromElement(element) {
      var selector = element.getAttribute('data-target');
Mark Otto's avatar
dist    
Mark Otto committed
106

Mark Otto's avatar
grunt    
Mark Otto committed
107
      if (!selector || selector === '#') {
108
        selector = element.getAttribute('href') || '';
Mark Otto's avatar
Mark Otto committed
109
110
111
112
113
      } // if it's an ID


      if (selector.charAt(0) === '#') {
        selector = escapeId(selector);
114
      }
fat's avatar
fat committed
115

Mark Otto's avatar
grunt    
Mark Otto committed
116
      try {
Mark Otto's avatar
dist    
Mark Otto committed
117
        var $selector = $(document).find(selector);
Mark Otto's avatar
grunt    
Mark Otto committed
118
119
120
121
        return $selector.length > 0 ? selector : null;
      } catch (error) {
        return null;
      }
122
123
    },
    reflow: function reflow(element) {
Mark Otto's avatar
grunt    
Mark Otto committed
124
      return element.offsetHeight;
125
    },
fat's avatar
fat committed
126
127
128
    triggerTransitionEnd: function triggerTransitionEnd(element) {
      $(element).trigger(transition.end);
    },
129
    supportsTransitionEnd: function supportsTransitionEnd() {
Mark Otto's avatar
Mark Otto committed
130
      return Boolean(transition);
fat's avatar
fat committed
131
    },
Mark Otto's avatar
dist    
Mark Otto committed
132
133
134
    isElement: function isElement(obj) {
      return (obj[0] || obj).nodeType;
    },
fat's avatar
fat committed
135
136
    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
      for (var property in configTypes) {
Mark Otto's avatar
dist    
Mark Otto committed
137
        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
Mark Otto's avatar
Mark Otto committed
138
139
          var expectedTypes = configTypes[property];
          var value = config[property];
Mark Otto's avatar
dist    
Mark Otto committed
140
          var valueType = value && Util.isElement(value) ? 'element' : toType(value);
Mark Otto's avatar
Mark Otto committed
141
142

          if (!new RegExp(expectedTypes).test(valueType)) {
Mark Otto's avatar
dist    
Mark Otto committed
143
            throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
Mark Otto's avatar
Mark Otto committed
144
          }
fat's avatar
fat committed
145
146
        }
      }
147
148
149
150
    }
  };
  setTransitionEndSupport();
  return Util;
Mark Otto's avatar
dist    
Mark Otto committed
151
}($);
Mark Otto's avatar
build    
Mark Otto committed
152
//# sourceMappingURL=util.js.map