PageSourceSearch

https://propnology.co.uk/core/js/bootstrap/modal.js

js propnology.co.uk collected 2026-10-07 17:38:17 UTC 9,343 bytes, 324 lines download raw bytes

vendor: 9,343 bytes, lines 1-324
1/* ========================================================================
2 * Bootstrap: modal.js v3.3.1
3 * http://getbootstrap.com/javascript/#modals
4 * ========================================================================
5 * Copyright 2011-2014 Twitter, Inc.
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 * ======================================================================== */
8
9
10+function ($) {
11  'use strict';
12
13  // MODAL CLASS DEFINITION
14  // ======================
15
16  var Modal = function (element, options) {
17    this.options        = options
18    this.$body          = $(document.body)
19    this.$element       = $(element)
20    this.$backdrop      =
21    this.isShown        = null
22    this.scrollbarWidth = 0
23
24    if (this.options.remote) {
25      this.$element
26        .find('.modal-content')
27        .load(this.options.remote, $.proxy(function () {
28          this.$element.trigger('loaded.bs.modal')
29        }, this))
30    }
31  }
32
33  Modal.VERSION  = '3.3.1'
34
35  Modal.TRANSITION_DURATION = 300
36  Modal.BACKDROP_TRANSITION_DURATION = 150
37
38  Modal.DEFAULTS = {
39    backdrop: true,
40    keyboard: true,
41    show: true
42  }
43
44  Modal.prototype.toggle = function (_relatedTarget) {
45    return this.isShown ? this.hide() : this.show(_relatedTarget)
46  }
47
48  Modal.prototype.show = function (_relatedTarget) {
49    var that = this
50    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
51
52    this.$element.trigger(e)
53
54    if (this.isShown || e.isDefaultPrevented()) return
55
56    this.isShown = true
57
58    this.checkScrollbar()
59    this.setScrollbar()
60    this.$body.addClass('modal-open')
61
62    this.escape()
63    this.resize()
64
65    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
66
67    this.backdrop(function () {
68      var transition = $.support.transition && that.$element.hasClass('fade')
69
70      if (!that.$element.parent().length) {
71        that.$element.appendTo(that.$body) // don't move modals dom position
72      }
73
74      that.$element
75        .show()
76        .scrollTop(0)
77
78      if (that.options.backdrop) that.adjustBackdrop()
79      that.adjustDialog()
80
81      if (transition) {
82        that.$element[0].offsetWidth // force reflow
83      }
84
85      that.$element
86        .addClass('in')
87        .attr('aria-hidden', false)
88
89      that.enforceFocus()
90
91      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
92
93      transition ?
94        that.$element.find('.modal-dialog') // wait for modal to slide in
95          .one('bsTransitionEnd', function () {
96            that.$element.trigger('focus').trigger(e)
97          })
98          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
99        that.$element.trigger('focus').trigger(e)
100    })
101  }
102
103  Modal.prototype.hide = function (e) {
104    if (e) e.preventDefault()
105
106    e = $.Event('hide.bs.modal')
107
108    this.$element.trigger(e)
109
110    if (!this.isShown || e.isDefaultPrevented()) return
111
112    this.isShown = false
113
114    this.escape()
115    this.resize()
116
117    $(document).off('focusin.bs.modal')
118
119    this.$element
120      .removeClass('in')
121      .attr('aria-hidden', true)
122      .off('click.dismiss.bs.modal')
123
124    $.support.transition && this.$element.hasClass('fade') ?
125      this.$element
126        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
127        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
128      this.hideModal()
129  }
130
131  Modal.prototype.enforceFocus = function () {
132    $(document)
133      .off('focusin.bs.modal') // guard against infinite focus loop
134      .on('focusin.bs.modal', $.proxy(function (e) {
135        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
136          this.$element.trigger('focus')
137        }
138      }, this))
139  }
140
141  Modal.prototype.escape = function () {
142    if (this.isShown && this.options.keyboard) {
143      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
144        e.which == 27 && this.hide()
145      }, this))
146    } else if (!this.isShown) {
147      this.$element.off('keydown.dismiss.bs.modal')
148    }
149  }
150
151  Modal.prototype.resize = function () {
152    if (this.isShown) {
153      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
154    } else {
155      $(window).off('resize.bs.modal')
156    }
157  }
158
159  Modal.prototype.hideModal = function () {
160    var that = this
161    this.$element.hide()
162    this.backdrop(function () {
163      that.$body.removeClass('modal-open')
164      that.resetAdjustments()
165      that.resetScrollbar()
166      that.$element.trigger('hidden.bs.modal')
167    })
168  }
169
170  Modal.prototype.removeBackdrop = function () {
171    this.$backdrop && this.$backdrop.remove()
172    this.$backdrop = null
173  }
174
175  Modal.prototype.backdrop = function (callback) {
176    var that = this
177    var animate = this.$element.hasClass('fade') ? 'fade' : ''
178
179    if (this.isShown && this.options.backdrop) {
180      var doAnimate = $.support.transition && animate
181
182      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
183        .prependTo(this.$element)
184        .on('click.dismiss.bs.modal', $.proxy(function (e) {
185          if (e.target !== e.currentTarget) return
186          this.options.backdrop == 'static'
187            ? this.$element[0].focus.call(this.$element[0])
188            : this.hide.call(this)
189        }, this))
190
191      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
192
193      this.$backdrop.addClass('in')
194
195      if (!callback) return
196
197      doAnimate ?
198        this.$backdrop
199          .one('bsTransitionEnd', callback)
200          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
201        callback()
202
203    } else if (!this.isShown && this.$backdrop) {
204      this.$backdrop.removeClass('in')
205
206      var callbackRemove = function () {
207        that.removeBackdrop()
208        callback && callback()
209      }
210      $.support.transition && this.$element.hasClass('fade') ?
211        this.$backdrop
212          .one('bsTransitionEnd', callbackRemove)
213          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
214        callbackRemove()
215
216    } else if (callback) {
217      callback()
218    }
219  }
220
221  // these following methods are used to handle overflowing modals
222
223  Modal.prototype.handleUpdate = function () {
224    if (this.options.backdrop) this.adjustBackdrop()
225    this.adjustDialog()
226  }
227
228  Modal.prototype.adjustBackdrop = function () {
229    this.$backdrop
230      .css('height', 0)
231      .css('height', this.$element[0].scrollHeight)
232  }
233
234  Modal.prototype.adjustDialog = function () {
235    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
236
237    this.$element.css({
238      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
239      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
240    })
241  }
242
243  Modal.prototype.resetAdjustments = function () {
244    this.$element.css({
245      paddingLeft: '',
246      paddingRight: ''
247    })
248  }
249
250  Modal.prototype.checkScrollbar = function () {
251    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
252    this.scrollbarWidth = this.measureScrollbar()
253  }
254
255  Modal.prototype.setScrollbar = function () {
256    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
257    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
258  }
259
260  Modal.prototype.resetScrollbar = function () {
261    this.$body.css('padding-right', '')
262  }
263
264  Modal.prototype.measureScrollbar = function () { // thx walsh
265    var scrollDiv = document.createElement('div')
266    scrollDiv.className = 'modal-scrollbar-measure'
267    this.$body.append(scrollDiv)
268    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
269    this.$body[0].removeChild(scrollDiv)
270    return scrollbarWidth
271  }
272
273
274  // MODAL PLUGIN DEFINITION
275  // =======================
276
277  function Plugin(option, _relatedTarget) {
278    return this.each(function () {
279      var $this   = $(this)
280      var data    = $this.data('bs.modal')
281      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
282
283      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
284      if (typeof option == 'string') data[option](_relatedTarget)
285      else if (options.show) data.show(_relatedTarget)
286    })
287  }
288
289  var old = $.fn.modal
290
291  $.fn.modal             = Plugin
292  $.fn.modal.Constructor = Modal
293
294
295  // MODAL NO CONFLICT
296  // =================
297
298  $.fn.modal.noConflict = function () {
299    $.fn.modal = old
300    return this
301  }
302
303
304  // MODAL DATA-API
305  // ==============
306
307  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
308    var $this   = $(this)
309    var href    = $this.attr('href')
310    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
311    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
312
313    if ($this.is('a')) e.preventDefault()
314
315    $target.one('show.bs.modal', function (showEvent) {
316      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
317      $target.one('hidden.bs.modal', function () {
318        $this.is(':visible') && $this.trigger('focus')
319      })
320    })
321    Plugin.call($target, option, this)
322  })
323
324}(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.