2013-12-22 3 views
1

Я почти этот код для определения плагина экземпляра:Функция вызывает внутри JQuery плагин

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

Я использую некоторый код, как этот, чтобы мой плагин работы:

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

So 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

Я думаю, что прослушиватель событий должен быть перемещен с помощью экземпляра плагина, но внутри анонимной функции. Ваш пример хороший enouch, но он не подходит для работы. – Jasper

+0

Да. Функция плагина «должна» связывает события только с селекторами опций, а не с глобальными селекторами. –

Смежные вопросы