2012-09-20 69 views
1

我正在寫一個jQuery插件,遇到了一個有趣的問題,我想將插件中的事件綁定到body上,並委託給一個特定的子元素。jQuery插件多個實例,綁定事件只有一次

這是沒有問題的,但是該插件是爲支持同一頁面上的多個實例而構建的,這會導致該事件被觸發插件在頁面上存在的次數。 (已經被綁定了很多次)

除了附加在窗口上的布爾標誌之外,還有沒有隻能綁定一次的插件代碼?

我可以通過綁定外部插件代碼來解決問題,所以它只綁定一次,或者通過確保定時器只設置一次,但我寧願不讓事件被觸發20次。我期待更多的,如果有另一種方式..

可能的解決方案

if (!window.tip.hoverIntent || window.tip.hoverIntent === undefined) { 
    //bind handler.. 
    window.tip.hoverIntent = true; 
} 

事件處理程序

$('body').on({ 
    mouseenter: function() { 
     clearTimeout(window.tip.timerID); 
    }, 
    mouseleave: function() { 
     window.tip.timerID = setTimeout(function() { 
      $('.tip-shown').remove(); 
     }, 250); 
    } 
}, '.tip-shown'); 

回答

1

您可以使用一個標誌插件功能之外

var first_time = true; 
$.fn.my_plugin = function() { 
    if (first_time) { 
     first_time = false; 
     $('body').on({ 
      mouseenter: function() { 
       clearTimeout(window.tip.timerID); 
      }, 
      mouseleave: function() { 
       window.tip.timerID = setTimeout(function() { 
        $('.tip-shown').remove(); 
       }, 250); 
      } 
     }, '.tip-shown'); 

    } 
}; 
0

你可以嘗試評估,如果你的處理程序之前再突破已經調用。如下所示:

function eventHandler(e) 
{ 
    if(e.handled !== true) 
    { 
    e.handled = true; 
    } 
    return false; 
} 

這應該只觸發一次您的事件。