2012-09-20 70 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; 
} 

这应该只触发一次您的事件。