2012-11-22 12 views
20

Używam podpowiedzi dostarczanych przez Twitter Bootstrap (http://twitter.github.com/bootstrap/javascript.html#tooltips).Dynamicznie umieszczaj etykietę Bootstrap (dla dynamicznie generowanych elementów)

Mam niektóre dynamicznie wstawiane znaczniki w moim DOM, które musi wywołać podpowiedzi. Dlatego wywołać podpowiedzi w następujący sposób (https://github.com/twitter/bootstrap/issues/4215):

$('body').tooltip({ 
    delay: { show: 300, hide: 0 }, 
    selector: '[rel=tooltip]:not([disabled])' 
}); 

Aby uniknąć etykietki są umieszczone zbyt blisko krawędzi ekranu, muszę aby móc ustawić swoją pozycję dynamicznie na podstawie położenia elementu, który uruchamia etykietę narzędzia. Myślałem, że robi to w następujący sposób:

$('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"; 
} 

Jak mogę przekazać currentElement prawidłowej funkcji positionTooltip w celu przywrócenia odpowiedniej wartości kwalifikacyjny dla każdej podpowiedzi?

Dzięki z góry

+0

Jak masz zamiar wywołać podpowiedź? Najedź, kliknij, inne? – technoTarek

+1

Etykiety narzędzi są wywoływane za pomocą hover dla każdego elementu, który ma atrybut "rel".Jest to domyślne zachowanie programu startowego. – maze

Odpowiedz

31

Bootstrap wywołuje funkcję kwalifikacyjny z params że zawiera element

this.options.placement.call(this, $tip[0], this.$element[0]) 

więc w Twoim przypadku, to zrobić:

$('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])' 
}); 
+1

Działa idealnie. wielkie dzięki. – maze

+1

Tylko jeden mały komentarz na temat tego pytania/odpowiedzi. A jeśli nie ma sensu. Jedyny sposób, w jaki można umieścić etykietkę narzędzia na dole/górze, to wartość position.left równa się dokładnie 515. Myślę, że ma ona na celu zwrócenie "lewego dolnego", "lewego górnego", "prawego dolnego" i "prawego górnego" ", ale jeśli tak jest, to coś trzeba zrobić z oświadczeniami if – Sindre

+1

działa dobrze dziękuję. –

5

Opcja w docs placement pozwala na funkcję. Nie jest udokumentowane (żebym mógł znaleźć) jakie argumenty są w funkcji. Można to jednak łatwo ustalić, rejestrując arguments na konsoli.

Oto co można użyć:

$('body').tooltip({ 

    placement: function(tip, el){ 
    var position = $(el).position(); 
     /* code to return value*/ 

    } 

/* other options*/ 
}) 
0

ten pracował dla mnie

$("[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"; 
      }, 

     }); 
5

ten sposób umieścić moją podpowiedź w 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); 
} 

zasadzie to, co mówię, jest to, że moja podpowiedź będzie umieszczony na górze z niektórych niestandardowych offset, również mała strzałka trójkąta u dołu będzie nieznacznie z prawej strony.

Pod koniec dodaję klasę in, która pokazuje etykietkę narzędzia.

Należy również pamiętać, że kod jest zawijany w funkcji setTimeout 0.

0

$(element).position() nie będzie działać poprawnie, jeśli opcja container jest ustawiona na etykietce narzędzi.

W moim przypadku używam container : 'body' i zamiast tego muszę użyć $(element).offset().

1

To jest skrótem, który mogę używać, aby określić szerokość okna jest mniejszy lub nie 768, a następnie zmienić rozmieszczenie podpowiedzi z lewej na górze:

placement: function(){return $(window).width()>768 ? "auto left":"auto top";} 
Powiązane problemy