jQuery為元素提供click、bind等方法綁定事件,但假如需要綁定事件的元素過多的話(如$("a")),不管是查找元素還是逐個綁定事件都比較影響效率;所以jQuery還提供了效率更高live方法,以及效率最高的delegate方法,來處理此類問題。
在使用qTip2的時候,也存在綁定tip的效率問題,不但要查找元素、綁定事件、及為每一個元素創建tip,比較浪費資源;幸好,qTip2也提供了類似live/delegate的方式來綁定tip;當然,如果嫌qTip2提供的不夠好,那也完全可以用jQuery.delegate方法來實現。
以下就這3種方式來實現為多個目標共享一個tip逐一演示,首先假定頁面存在以下元素:
<p id="demo1"> 我的博客地址: <a href="http://lwme.cnblogs.com/" target="_blank" title="囧月">囧月</a> </p>
通過設置position.target=event
這也是官方DEMO中使用的方法,主要演示為有title屬性的a標記顯示tip:
// 選擇demo1下有title屬性的a標記 var elems = $('#demo1 a[title]') // 移除title屬性,保存title到tooltip屬性中 .each(function(i) { $.attr(this, 'tooltip', $.attr(this, 'title')); }) .removeAttr('title'); // 創建一個用於共享的tip $('<div />').qtip( { content: ' ', position: { target: 'event', // 通過事件響應 effect: false // 關閉默認的 'slide' 動畫效果 }, show: { target: elems // 設置顯示的目標元素 }, hide: { target: elems }, events: { show: function(event, api) { // 更新tip內容 var target = $(event.originalEvent.target); if(target.length) { api.set('content.text', target.attr('tooltip')); } } } });
通過設置positon.target=mouse
這種方法通過在指定區域創建一個tip,並跟隨鼠標指針移動,實時顯示當前指向目標的內容:
var setText = function(event, api) { var target = $(event.originalEvent && event.originalEvent.target); if(target.length) { api.set('content.text', target.text()); // 更新內容 } }; // 在指定區域創建用於共享的tip $('#demo1').qtip( { content: ' ', position: { target: 'mouse', // 跟隨鼠標指針 effect: false, // 關閉效果 viewport: $(window), adjust: { x: 10, y: 10 } // tip位置偏移,防止遮住鼠標指針 }, events: { show: setText, move: setText // 移動時也設置內容 } });
當然,這種方法有一個缺點,就是無法針對容器內特定的標記進行提示,所以這種方法比較適用於表格。
PS:或許是我沒找到方法,反正通過api的show/hide方法,經常會顯示不出來。
通過jQuery的delegate綁定事件
這種方法是直接創建一個tip,然后通過mouseover/mouseout事件來控制tip的顯示隱藏
// 創建用於共享的tip var api = $('<div />').qtip( { content: ' ', show: { event: false } }).qtip("api"); // 監聽事件 $("#demo1").delegate("a", "mouseover mouseout", function(e) { if (e.type == 'mouseover') { api.set('position.target', $(this)); api.set('content.text', this.innerHTML); api.show(); } else api.hide(); });
結尾
以上方法僅僅只是一些嘗試,還有一些不完善的地方,當然相對來說還是官方DEMO提供的方法完善一些;如果哪位TX有更好的方法,也請提供下。
最后還是提供一下DEMO。