2013-12-22 46 views
1

我这就这段代码定义插件实例:功能jQuery插件里面调用

$.fn.someplugin = function(opts) { 
    $(document).on('click', '.option-1', function() { 
    alert(1); 
    }); 
}; 

我使用一些代码,这样一个让我的插件工作:

$('.selector-1').someplugin(); 

所以在jQuery的这种方式将可能的一个点击事件监听器绑定到文档。

问题是,当我多次使用插件时,这是否意味着jQuery将10个单击事件绑定到文档?

$('.selector-1').someplugin(); 
$('.selector-2').someplugin(); 
$('.selector-3').someplugin(); 
$('.selector-4').someplugin(); 
$('.selector-5').someplugin(); 
$('.selector-6').someplugin(); 
$('.selector-7').someplugin(); 
$('.selector-8').someplugin(); 
$('.selector-9').someplugin(); 
$('.selector-10').someplugin(); 

通过这种方式,它绑定了10个点击监听器 - 因为fn.someplugin被调用了10次,或者只是一个?

回答

2

是的,它将10个点击侦听器绑定到$(document)对象。

每次拨打电话someplugin()时,它都会绑定一个新的监听者。

JSFIDDLE


如果你想一个单一的点击处理程序添加到文件(你的插件内),你可以这样做:

(function ($) { 
    $.fn.someplugin = function(opts) { 
     alert("Another someplugin call."); 
    }; 

    $(document).on('click', '.option-1', function() { 
     alert(1); 
    }); 
})($); 

JSFIDDLE

+0

该死的,这是非常糟糕的。 – Jasper

+0

@Steve为什么它真的很糟糕?你能指望什么? –

+0

我想尽量减少事件处理程序,因为我的页面上可能会有超过200个插件调用。当时性能开始下滑。 – Jasper

2

你可以做这只能绑定一次:

(function ($) { 
    $.fn.someplugin = function (opts) { 
     return $(this).each(function (index, value) { 
      $(document) 
      .off('click', '.option-1') 
      .on('click', '.option-1', function (event) { 
       event.preventDefault(); 
       alert(1); 
      }); 
     }); 
    }; 
})(jQuery); 

$(document).ready(function() { 
    $('.selector-1, .selector-2').someplugin(); 
}); 

$(this).each允许您绑定多个选择器。

.off()取消绑定该事件(如果存在)。

的jsfiddle:http://jsfiddle.net/rWYS4/

+0

我认为应该将事件监听器移动到插件实例的顶部,但是在匿名函数中。你的例子很好,但它不是一个友好的表现。 – Jasper

+0

是的。插件函数'should'只绑定选项选择器上的事件,而不是全局选择器上的事件。 –