aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorChris Rebert <[email protected]>2014-01-16 20:31:19 -0800
committerChris Rebert <[email protected]>2014-01-16 20:32:59 -0800
commit6af0013ac52c391dd7623f9cbbb25cd7d3c43d35 (patch)
treed4332bb7ccf9058c2369e52745c7b741a94a4fbe /js
parentfaa783e9896c3353f9c4820dea5952bca900cda5 (diff)
downloadbootstrap-6af0013ac52c391dd7623f9cbbb25cd7d3c43d35.tar.xz
bootstrap-6af0013ac52c391dd7623f9cbbb25cd7d3c43d35.zip
Revert "Add tooltip `viewport` option, respect bounds of the viewport"
This reverts commit edb221a20ceabebd427e27d0432e94a227717217. Reverting due to broken JS unit tests. Conflicts: docs/javascript.html
Diffstat (limited to 'js')
-rw-r--r--js/tests/unit/tooltip.js65
-rw-r--r--js/tooltip.js81
2 files changed, 30 insertions, 116 deletions
diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js
index 9fab6c61f..b9b003dd1 100644
--- a/js/tests/unit/tooltip.js
+++ b/js/tests/unit/tooltip.js
@@ -338,10 +338,10 @@ $(function () {
})
test('should add position class before positioning so that position-specific styles are taken into account', function () {
- $('head').append('<style id="test"> .tooltip.right { white-space: nowrap; } .tooltip.right .tooltip-inner { max-width: none; } </style>')
+ $('head').append('<style> .tooltip.right { white-space: nowrap; } .tooltip.right .tooltip-inner { max-width: none; } </style>')
var container = $('<div />').appendTo('body'),
- target = $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line" style="position: fixed; top: 10px; left: 0px;"></a>')
+ target = $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"></a>')
.appendTo(container)
.tooltip({placement: 'right'})
.tooltip('show'),
@@ -353,67 +353,6 @@ $(function () {
var topDiff = top - top2
ok(topDiff <= 1 && topDiff >= -1)
target.tooltip('hide')
- $('head #test').remove()
- })
-
- test('should adjust the tip\'s top when up against the top of the viewport', function () {
- $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')
-
- var container = $('<div />').appendTo('body'),
- target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; top: 0px; left: 0px;"></a>')
- .appendTo(container)
- .tooltip({placement: 'right', viewportPadding: 12})
- .tooltip('show'),
- tooltip = container.find('.tooltip')
-
- ok( Math.round(tooltip.offset().top) === 12 )
- target.tooltip('hide')
- $('head #test').remove()
- })
-
- test('should adjust the tip\'s top when up against the bottom of the viewport', function () {
- $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')
-
- var container = $('<div />').appendTo('body'),
- target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; bottom: 0px; left: 0px;"></a>')
- .appendTo(container)
- .tooltip({placement: 'right', viewportPadding: 12})
- .tooltip('show'),
- tooltip = container.find('.tooltip')
-
- ok( Math.round(tooltip.offset().top) === Math.round($(window).height() - 12 - tooltip[0].offsetHeight) )
- target.tooltip('hide')
- $('head #test').remove()
- })
-
- test('should adjust the tip\'s left when up against the left of the viewport', function () {
- $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')
-
- var container = $('<div />').appendTo('body'),
- target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; top: 0px; left: 0px;"></a>')
- .appendTo(container)
- .tooltip({placement: 'bottom', viewportPadding: 12})
- .tooltip('show'),
- tooltip = container.find('.tooltip')
-
- ok( Math.round(tooltip.offset().left) === 12 )
- target.tooltip('hide')
- $('head #test').remove()
- })
-
- test('should adjust the tip\'s left when up against the right of the viewport', function () {
- $('head').append('<style id="test"> .tooltip .tooltip-inner { width: 200px; height: 200px; max-width: none; } </style>')
-
- var container = $('<div />').appendTo('body'),
- target = $('<a href="#" rel="tooltip" title="tip" style="position: fixed; top: 0px; right: 0px;"></a>')
- .appendTo(container)
- .tooltip({placement: 'bottom', viewportPadding: 12})
- .tooltip('show'),
- tooltip = container.find('.tooltip')
-
- ok( Math.round(tooltip.offset().left) === Math.round($(window).width() - 12 - tooltip[0].offsetWidth) )
- target.tooltip('hide')
- $('head #test').remove()
})
test('tooltip title test #1', function () {
diff --git a/js/tooltip.js b/js/tooltip.js
index 2bc718d63..a976bbf1e 100644
--- a/js/tooltip.js
+++ b/js/tooltip.js
@@ -34,9 +34,7 @@
title: '',
delay: 0,
html: false,
- container: false,
- viewport: 'body',
- viewportPadding: 0
+ container: false
}
Tooltip.prototype.init = function (type, element, options) {
@@ -44,7 +42,6 @@
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
- this.$viewport = $(this.options.viewport)
var triggers = this.options.trigger.split(' ')
@@ -160,14 +157,18 @@
var actualHeight = $tip[0].offsetHeight
if (autoPlace) {
- var orgPlacement = placement
var $parent = this.$element.parent()
- var parentDim = this.getElementDimensions($parent)
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' :
- placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' :
- placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' :
+ var orgPlacement = placement
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
+
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
placement
$tip
@@ -227,22 +228,29 @@
var actualHeight = $tip[0].offsetHeight
if (placement == 'top' && actualHeight != height) {
+ replace = true
offset.top = offset.top + height - actualHeight
}
- var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+ if (/bottom|top/.test(placement)) {
+ var delta = 0
+
+ if (offset.left < 0) {
+ delta = offset.left * -2
+ offset.left = 0
- if (delta.left)
- offset.left = offset.left + delta.left
- else
- offset.top = offset.top + delta.top
+ $tip.offset(offset)
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+ }
- var arrowDelta = delta.left * 2 - (delta.left ? width + actualWidth : height + actualHeight)
- var arrowPosition = delta.left ? 'left' : 'top'
- var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+ } else {
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
+ }
- $tip.offset(offset)
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
+ if (replace) $tip.offset(offset)
}
Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
@@ -308,39 +316,6 @@
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
-
- }
-
- Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
- var delta = {}
- var viewportPadding = this.options.viewportPadding
- var viewportDimensions = this.getElementDimensions(this.$viewport)
-
- if (/right|left/.test(placement)) {
- if (pos.top + actualHeight - viewportDimensions.scroll + viewportPadding > viewportDimensions.height) { // bottom overflow
- delta.top = viewportDimensions.height + viewportDimensions.scroll - actualHeight - viewportPadding - pos.top
- } else if (pos.top - viewportDimensions.scroll - viewportPadding < 0) { // top overflow
- delta.top = viewportDimensions.scroll + viewportPadding - pos.top
- }
- } else {
- if (pos.left + actualWidth + viewportPadding > viewportDimensions.width) { // right overflow
- delta.left = viewportDimensions.width - actualWidth - viewportPadding - pos.left
- } else if (pos.left - viewportPadding < viewportDimensions.left) { // left overflow
- delta.left = viewportDimensions.left + viewportPadding - pos.left
- }
- }
-
- return delta
- }
-
- Tooltip.prototype.getElementDimensions = function ($element) {
- var isBody = $element[0].tagName == 'BODY'
- return {
- scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
- width: isBody ? window.innerWidth : $element.outerWidth(),
- height: isBody ? window.innerHeight : $element.outerHeight(),
- left: isBody ? 0 : $element.offset().left
- }
}
Tooltip.prototype.getTitle = function () {