2013-02-26 65 views
11

更新到引導2.3.0後,我注意到popover tooltip的奇怪行爲。Popover隱藏父元素,如果與原型JS一起使用

如果您輸入該字段並試圖離開,工具提示將消失並隱藏輸入字段。只有最新版本的bootstrap纔會出現此問題,但不確定究竟發生了什麼變化,但2.2.2與Prototype一起使用效果良好。

jQuery.noConflict(); 
jQuery('input[data-content]').popover({ 
    trigger: 'focus' 
}); 

這裏是工作示例:http://jsfiddle.net/U6EDs/4/

+0

嘗試使用此引導友好的prototype.js,因爲它固定我的問題:http://stackoverflow.com/questions/19139063/twitter-bootstrap-3-dropdown-menu-disappears-when-used-with-原型-js – MWD 2013-10-03 15:02:00

回答

21

這github上的問題https://github.com/twitter/bootstrap/issues/6921描述你所看到的。我正在複製這個問題的信息。

在自舉-tooltip.js這些線導致此問題:

, hide: function() { 
    var that = this 
    , $tip = this.tip() 
    , e = $.Event('hide') ///this line 

    this.$element.trigger(e) /// this line 
    if (e.isDefaultPrevented()) return //and this line 

PrototypeJS添加方法添加到元原型所以當jQuery的嘗試觸發元件上的hide()方法它實際上是燒製PrototypeJS hide()方法,這相當於對jQuery hide()方法和設置元素的風格display:none;

您有幾種選擇

  1. 刪除在JS上述標線文件
  2. 重命名事件,其他的東西(不隱藏)
  3. 使用自舉(目前與2.3.2)

http://github.com/jwestbrook/bootstrap-prototype

的PrototypeJS叉

*****免責聲明***

我當前移植自舉JS組件PrototypeJS

開發商
+0

我遇到了這個問題,但似乎Bootstrap在v3中命名了其事件。任何其他的想法爲什麼它仍然可能發生? – 2013-09-18 16:48:49

+1

實際上他們沒有使用傳統命名空間格式'namespace:event',他們是使用'event.namespace'的命名空間,它仍然觸發PrototypeJS隱藏事件 – 2013-09-18 17:13:26

+0

啊,謝謝。有沒有編輯bootstrap.js的解決辦法? – 2013-09-18 18:29:19

0

我通過這種方式編輯引導JS「固定」的錯誤:
(註釋掉線this.$element.trigger(e)

, hide: function() { 
    var that = this 
    , $tip = this.tip() 
    , e = $.Event('hide') 

    this.$tip.trigger(e) 
//this.$element.trigger(e) 
    if (e.isDefaultPrevented()) return 
5

我知道這是一個老問題,但我只是碰到了這個(再次)和上述答案不適合我。我最終找到了一個解決方案,而不需要入侵任何庫。它的想法是在元素被隱藏後顯示元素。沒有閃爍,它很好。

jQuery(function() { 
    jQuery.noConflict(); 
     jQuery('input[data-content]').popover({ 
      trigger: 'focus' 
     }).on('hidden.bs.popover', function(){ 
      jQuery(this).show(); 
     }); 
}); 

你可以使用相同的技術工具提示,只需使用on('hidden.bs.tooltip'), ...

請注意,我用的引導3.0.0大多數我個人的測試。下面是從問題,它使用BS 2.3更新的小提琴: http://jsfiddle.net/calypsonian/U6EDs/13/

+0

真棒,你救了我的一天......不幸的是,所討論的因素暫時消失,然後再次出現;你知道解決這個問題的方法嗎? – user13955 2014-03-24 23:47:40

+1

我得到閃爍:( – 2014-04-10 07:16:36

+0

我也得到了閃爍,但它好於消失,謝謝! – Supamic 2015-03-17 21:53:38

2

對於我越好(在不改變引導源代碼)是爲了防止事件並手動刪除「中的」類隱藏工具提示:

jQuery("input").on('hide.bs.tooltip', function(e) { 
    e.preventDefault(); 
    $("div.tooltip.in").removeClass('in'); 

}); 

唯一的問題是它可以防止觸發「hidden.bs.tooltip」事件。但如果你不介意,我建議使用這種解決方案,因爲它不會導致閃爍

+0

注意它僅適用於Bootstrap 3 – MatiK 2014-04-28 15:03:32

+0

它不適用於我,我不得不改變代碼 'jQuery 「.tooltipped」)。('hide.bs.tooltip',function(e){ e.preventDefault(); $(「div.tooltip.in」)。remove(); });' – Inluxc 2015-09-16 14:45:18

+1

優秀的答案。也適用於酥料餅(例如使用工具提示中給出)。 – BlueC 2017-04-11 14:58:32

5

我花了一些時間看着這個。

這就是它發生的原因。

原型的策略是擴展具有新行爲的DOM元素類,例如'hide'。等效的:

HTMLElement.prototype.hide = function(...) {...}; 

jQuery讓,如果一個元素都有相同的名稱作爲事件的功能,那麼它被認爲是默認行爲的元素在觸發該事件的假設。例如,這對於事件'焦點','模糊'等是有用的,其中既有名稱爲'焦點'的事件又有元素.focus()上的匹配函數。當你調用jQuery的event.preventDefault()時,它實際上並不是阻止的默認行爲。相反,它是相反的 - 如果你調用event.preventDefault(),然後jQuery查找與該事件同名的函數,然後調用它,如果它存在。

這裏是jQuery的SRC是手動調用「默認行爲」功能: https://github.com/jquery/jquery/blob/d837f119c3729565103005d5d7fa89e1dd8110cb/src/event.js#L338

因此,我們有我們的問題。 Prototype用新函數(即'hide')擴展了基本的HTMLElement原型。當同名的事件被觸發時,jQuery將這些函數視爲默認行爲。 Bootstrap的JS觸發了一個名稱相同的事件('hide'),這會錯誤地導致jQuery調用Prototype的Element.hide()函數。

我打算根據這些信息研究解決方案。也許東西沿着線:

jQuery(window).load(function() { 
    // Defer this code until after the window 'load' event finishes firing 
    setTimeout(function() { 
     window.HTMLElement && 
     window.HTMLElement.prototype.hide && 
     delete window.HTMLElement.prototype.hide; 
    }, 0); 
}); 
+0

值得更多的選票,因爲它解決了這個問題,一般和不修改的庫文件。 – 2015-07-07 18:03:19

+0

是但它可能損害PrototypeJS的預期行爲。 – colllin 2015-07-07 18:55:54

2

您可以在鼠標離開事件一樣再次顯示,

jQuery(function(){ 
    jQuery('[data-toggle="popover"]').popover().on('mouseleave',function(){ 
     $(this).show(0); // show it again when mouse leave event fires 
    }); 
}); 

Live Demo

0

一個可能的解決方案是始終顯示通過CSS的元素。

[data-toggle=tooltip] { 
    display: block!important; 
} 
1

我添加了一個重要的CSS樣式來覆蓋原型添加的元素樣式。這適用於我,因爲沒有什麼應該隱藏元素。

#elemId{ 
    display: block!important; /* or whatever the original display was */ 
} 
相關問題