先說下遇到這個問題的背景吧。
就是在頁面中有個div,這個div右上角(或者其他位置)有個 × 的圖標(這個圖標添加tooltip工具提示),光標移到這個圖標時,觸發tooltip,提示“點擊移除”這樣類似的字樣,然后點擊后,把這個div作remove()這樣的刪除操作。
然后,問題來了,因為這個div被remove()了,導致生成的tooltip對應的 × 圖標也被remove(),因為找不到,所以對應的mouseout(可能是mouseleave事件,參考了一下bootstrap的源碼,沒找出頭緒,猜測是這兩個的其中一個)事件就沒法觸發,導致tooltip工具提示一直在那里,出bug了。
文字不多講,上圖比較直觀。
先把代碼附上:
【代碼部分】(里面的bootstrap文件和js用的本地的,有需要自己嘗試運行的到時候需要改動一下):
<!DOCTYPE html> <html lang="zh-CN"> <head> <title>test</title> <meta charset="utf-8"> <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="./font-awesome/css/font-awesome.min.css"> <script src="./bootstrap/js/jquery-1.11/jquery.min.js"></script> <script src="./bootstrap/js/bootstrap.min.js"></script> </head> <body> <div style="width:70%;margin:50px auto;height:300px;"> <a id="test01" href="javascript:;" data-toggle="tooltip" title="反饋錯誤" data-placement="top" data-container="body"> <span class="fa fa-bug"></span> </a> <a id="test" href="javascript:;" data-toggle="tooltip" title="點擊移除" data-placement="top" data-container="body"> <span class="fa fa-times"></span> </a> </div> <script> $("[data-toggle='tooltip']").tooltip(); $("#test").on("click",function(){ var $this = $(this); $this.remove(); $(".tooltip.fade.top.in").remove();//這行代碼是我個人用來解決這個問題而添加的 }) </script> </body> </html>
火狐中,頁面效果和對應的代碼(好像和上面附上的代碼重了,不過比較直觀)
鼠標划過對應的圖標(已經添加了tooltip,用了bootstrap框架提供的樣式和js),同時留意一下tooltip所對應div的id
光標移開后,再聚焦到對應的×圖標上,對比一下id,發現id變了
這里,順便說一下,原本我是打算去看bootstrap的源碼,看看他在tooltip這塊的源碼怎么寫的,好從根源上解決問題。
后來看了一部分后,放棄了,對我現在的半吊子水平來說,壓力有點大。
但是至少從這個來說,生成的tooltip,id是隨機的,而且tooltip的隱藏,並不是“display:none”的隱藏,應該是“remove()”的隱藏。
PS:我個人的理解,不知道對不對,希望來大神指導一下。
重現一下bug吧,下面上圖。
下面把那行代碼的注釋取消,用我自己的方法試一下。
以上就是用我的方法得到的最后效果了。
把 × 圖標移除后,鼠標再划過 bug 圖標,可以正常顯示tooltip工具提示,至少,現階段看來沒問題,至於截圖,太占位置了,還是不上了。
PS:這個方法我和同事提了一下,因為tooltip這塊用的是bootstrap提供的框架,一整套的,就怕改動一下,別的地方出現問題,所以,我這個新人小白就放棄這個方法了,希望大神來指導一下,能有更好的辦法。
【總結】
最后,再額外廢話幾句吧。
剛開始的思路,是通過要刪除的元素,找到對應生成的tooltip,然后把它隱藏的(display:none),后來發現好像找不到。
因為id會一直變(我個人猜想,沒驗證,因為源碼讀起來對我有點壓力,至少他的id應該是隨機生成的,就算是有規則的,我也實在不知道),就像剛開始那兩張截圖提到的,找不到唯一的;如果通過class來找,可能找到的不是唯一的,因為同一個頁面下還有其他的標簽元素也能使用了tooltip。
后來在本地試了下后,主要是生成的tooltip沒有刪去(之所以不用“隱藏”,正如上面那幾張截圖提到的,並非toolitip提示display:none,而是直接remove()了該提示)。
然后想了下,每次光標經過添加了tooltip的元素后,好像這個都是重新生成的,對應的,每次光標移除,對應的tooltip都會remove(),
所以想到了這個方法:在對應元素remove()后,找到頁面上的$("div.tooltip.fade.in"),然后remove(),理論上是不會影響到其他的。