@av_tyschenko

JQuery как лучше прописать события при написании плагина?

Друзья, пишу плагин, столкнулся с проблемой. При событии change не адекватно реагирует. Как мне лучше прописывать события?

Данный пример ищет на сайте поля input['type=file'] с классом .square_upload, и заворачивает их в label. Дальше я хочу сделать событие при выборе файла. Но он у меня начинает срабатывать по несклько раз, если разместить 3 поля, то при выборе первого, будет 3 прохода, 2рого - 2 и тд...
(function( $ ){

  var $this = $(this);

  var methods = {

    init : function( options ) {

      return this.each(function(){

        $this        = $(this);
        $this.width  = $this.data('width');
        $this.height = $this.data('height');

        methods._build();
        methods._initEvents();

      });
    },

    _build : function(){

        $this.wrap( '<label class="unit_upload" />' );

        $this.unit_upload = $this.parent();

        $this.unit_upload.css({
            'width'  : $this.width,
            'height' : $this.height
        });
        $this.parent().append( '<div class="preview" />' );

    },

    _initEvents : function(){



        $(document).on('change', '.unit_upload input', function(event) {

            console.log('1';)

        });

    }

  };

  $.fn.square_upload = function(method){
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || ! method) {
      return methods.init.apply(this, arguments);
    } else {
      return methods.init.apply(this);
    }
  };

  $(".square_upload").square_upload();

})( jQuery );
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 1
phfaster
@phfaster
Прогрессивный веб-разработчик
Так Вы в _initEvents() всем элементам селектора ".unit_upload input" задаете функцию. Сразу всем. А перед этим Вы еще по каждому проходитесь (при этом при проходе каждого он всем снова добавляет функцию) и получается он подключает событие снова. Получается, что в конце концов он добавляет по {3} функции на каждый из элементов.

Просто определитесь где вы проходитесь по всем элементам. В init достаточно прописать methods._initEvents(); без each. Он и так всем элементам подключит эту функцию. Или просто в _initEvents() ловите текущий элемент и суйте его в селектор on() вместо ".unit_upload input";
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы