[英]Dynamically position Bootstrap tooltip (for dynamically generated elements)
I am using the Tooltips provided by Twitter Bootstrap (http://twitter.github.com/bootstrap/javascript.html#tooltips). 我正在使用Twitter Bootstrap提供的工具提示(http://twitter.github.com/bootstrap/javascript.html#tooltips)。
I have some dynamically inserted markup in my DOM which needs to trigger the tooltips. 我的DOM中有一些动态插入的标记需要触发工具提示。 That's why I trigger tooltips in the following way (https://github.com/twitter/bootstrap/issues/4215):
这就是我以下列方式触发工具提示的原因(https://github.com/twitter/bootstrap/issues/4215):
$('body').tooltip({
delay: { show: 300, hide: 0 },
selector: '[rel=tooltip]:not([disabled])'
});
To avoid tooltips being placed too close to the edge of the screen, I need to be able to set their position dynamically based on where the element which triggers the tooltip is positioned. 为了避免工具提示放置得太靠近屏幕边缘,我需要能够根据触发工具提示的元素的位置动态设置它们的位置。 I thought of doing it the following way:
我想到了以下方式:
$('body').tooltip({
delay: { show: 300, hide: 0 },
// here comes the problem...
placement: positionTooltip(this),
selector: '[rel=tooltip]:not([disabled])'
});
function positionTooltip(currentElement) {
var position = $(currentElement).position();
if (position.left > 515) {
return "left";
}
if (position.left < 515) {
return "right";
}
if (position.top < 110){
return "bottom";
}
return "top";
}
How can I pass currentElement correctly to the positionTooltip function in order to return the appropriate placement value for each tooltip? 如何将currentElement正确传递给positionTooltip函数,以便为每个工具提示返回适当的放置值?
Thanks in advance 提前致谢
Bootstrap calls the placement function with params that includes the element Bootstrap使用包含元素的参数调用放置函数
this.options.placement.call(this, $tip[0], this.$element[0])
so in your case, do this : 所以在你的情况下,这样做:
$('body').tooltip({
delay: { show: 300, hide: 0 },
placement: function(tip, element) { //$this is implicit
var position = $(element).position();
if (position.left > 515) {
return "left";
}
if (position.left < 515) {
return "right";
}
if (position.top < 110){
return "bottom";
}
return "top";
},
selector: '[rel=tooltip]:not([disabled])'
});
The placement
option in docs allows for function . docs中的
placement
选项允许函数。 It isn't documented ( that I could find) what arguments are in the function. 它没有记录(我可以找到)函数中的参数。 This is easy to determine however by logging
arguments
to console. 但是,通过将
arguments
记录到控制台,很容易确定。
Here's what you can use: 这是你可以使用的:
$('body').tooltip({
placement: function(tip, el){
var position = $(el).position();
/* code to return value*/
}
/* other options*/
})
This is how I place my tooltip in Bootstrap 2.3.2 这就是我在Bootstrap 2.3.2中放置工具提示的方法
placement: function (tooltip, trigger) {
window.setTimeout(function () {
$(tooltip)
.addClass('top')
.css({top: -24, left: 138.5})
.find('.tooltip-arrow').css({left: '64%'});
$(tooltip).addClass('in');
}, 0);
}
Basically what I'm saying here is that my tooltip will be positioned on the top with some custom offset, also the little triangle arrow on the bottom will be slightly to the right. 基本上我在这里说的是我的工具提示将位于顶部,带有一些自定义偏移,底部的小三角箭头也会略微向右。
At the end I'm adding the in
class which shows the tooltip. 在年底,我加入
in
类,它显示工具提示。
Also note that the code is wrapped in setTimeout 0
function. 另请注意,代码包含在
setTimeout 0
函数中。
这是我用来确定窗口宽度是否小于768的简写,然后从左到右更改工具提示位置:
placement: function(){return $(window).width()>768 ? "auto left":"auto top";}
this one worked for me 这个对我有用
$("[rel=tooltip]").popover({
placement: function(a, element) {
var position = $(element).parent().position();
console.log($(element).parent().parent().is('th:first-child'));
if ($(element).parent().parent().is('th:last-child')) {
return "left";
}
if ($(element).parent().parent().is('th:first-child')) {
return "right";
}
return "bottom";
},
});
$(element).position()
will not work properly if the option container
is set to the tooltip. 如果将选项
container
设置为工具提示, $(element).position()
将无法正常工作。
In my case, I use container : 'body'
and have to use $(element).offset()
instead. 在我的情况下,我使用
container : 'body'
而不得不使用$(element).offset()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.