Событие плагина jquery относится только к последнему элементу - PullRequest
1 голос
/ 20 марта 2012

Я делаю плагин (мой первый, извините, если грязный;)) для jquery, все работает отлично, за исключением событий. События всегда применяются к последнему элементу, несмотря ни на что. если только один элемент, все работает отлично, но с двумя или более элементами происходит сбой.

Я просматривал похожие подсказки, но не могу найти решение для моей.

код включен:

http://jsbin.com/itajow/edit#javascript,html

и демо находится в

http://jsbin.com/itajow

просто отфильтруйте или пройдите нумерацию страниц, чтобы увидеть проблему.

Заранее спасибо !!

1 Ответ

0 голосов
/ 20 марта 2012

Переменная self, используемая в методах, использовалась по-разному - где-то была сделана локальная переменная (var self = this в методе), а в других местах она использовалась как переменная со временем жизни вне метода (опуская var).Я не знаю, было ли это намеренно, чтобы получить какой-то другой эффект, но локальная переменная устранила проблему подкачки только с последним элементом.

Обновленный код на http://jsbin.com/itajow/11/edit

Примечание: объявление addNav:function(self) принимает объект self, но он вызывается как с параметром в коде, так и без него, поэтому первая строка функции исправляет это, выполняя self = self || this.

Редактировать Чтобы фильтрация списка работала, привязка события может быть переписана следующим образом:

self.$elem.find(".beautableFilter").on("keyup", function() {
    var input = $(this).val(); //this == the input element
    self.addFiltrado(input);
});

, а метод addFilterado должен принимать input в качестве параметра, а не находить его сам.

(код, чтобы сохранить его здесь на SO)

// JavaScript Document
// requiere pubsub!!
// requiere contains insensitive!!
jQuery.expr[":"].contains=function(a,i,m) {
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
(function(a) { var b=a({});a.subscribe=function() { b.on.apply(b,arguments); },a.unsubscribe=function() { b.off.apply(b,arguments); },a.publish=function() { b.trigger.apply(b,arguments); } })(jQuery);

if(typeof Object.create!=='function') {
    Object.create=function(obj) {
        function F() { }
        F.prototype=obj;
        return new F();
    };
}

(function($,window,document,undefined) {
    var Beautable={
        init: function(options,elem) {
            var self=this;

            self.elem=elem;
            self.$elem=$(elem);

            self.$elem.addClass("beautable");

            self.ncols=self.$elem.find("th").size();
            self.nrows=self.$elem.find("tr").size()-1;

            if(options===undefined) {
                options={};
            }
            self.options=$.extend({},$.fn.beautable.options,options);

            self.subscribeTo();
            self.addFooter();
            if(self.options.filtro) { self.addHeader(); }
            self.addData();

            if(self.options.multicheck) { self.multicheckFn(); }
            if(self.options.showTotal) { self.showTotal(); }
            if(self.options.maxRows>0) { self.addNav(); }

            self.bindEvents();

            //self.hideRows(3,4);
        },
        subscribeTo: function() {
            //$.subscribe('twitter.getTweets', Twitter.cleanTweets);
            //$.subscribe('twitter.gotTweets', Twitter.attachTemplate);
        },

        bindEvents: function() {
            var self=this;
            if(self.options.multicheck) {
                self.$checkPadre.on("click",function() {
                    self.multicheckEvent();
                });
            }
            if(self.options.maxRows>0&&self.nrows>self.options.maxRows) {
                self.$elem.find(".beautableButton").on("click",function() {
                    self.buttonClicked($(this));
                });
            }
            if(self.options.filtro) {
              self.$elem.find(".beautableFilter").on("keyup", function() {
                var input = $(this).val(); //this == the input element
                self.addFiltrado(input);
              });
            }
        },
        multicheckFn: function() {
            var self=this;
            self.$checks=self.$elem.find("input[type='checkbox']");
            self.$checkPadre=self.$checks.eq(0);

            self.$checkPadre.attr("checked",false);
        },
        multicheckEvent: function() {
            var self=this;
            self.$checks.attr("checked",self.$checkPadre.is(':checked'));
        },

        showTotal: function() {
            var self=this;
            self.$elem.find("tfoot tr td").append('<div class="floatedl">Total: '+self.nrows+' filas</div>');
        },
        addFooter: function() {
            var self=this;
            self.$elem.find("tbody").after('<tfoot><tr><td colspan="'+self.ncols+'">&nbsp;</td></tr></tfoot>');
        },
        addHeader: function() {
            var self=this;
            self.$elem.find("thead").prepend('<tr><th colspan="'+self.ncols+'"><div class="floatedr"><input type="text" placeholder="Filtrar..." class="beautableFilter"></div></th></tr></tfoot>');
        },

        addData: function() {
            var self=this;
            nrowsdata=0;
            $.each(self.$elem.find("tbody tr"),function() {
                $(this).data("nrow",++nrowsdata);
            });
        },
        buttonClicked: function($bt) {
            var self=this;
            page=$bt.data("page");
            maxp=self.options.maxRows*page;
            minp=maxp-self.options.maxRows+1;
            self.hideRows(minp,maxp);
            self.$elem.find(".beautableButton").removeClass("selected");
            $bt.addClass("selected");
        },
        hideRows: function(minR,maxR) {
            var self=this;
            $.each(self.$elem.find("tbody tr"),function() {
                if($(this).data("nrow")<minR||$(this).data("nrow")>maxR) { $(this).hide(); } else { $(this).show(); }
            });
        },
        addNav: function(self) {
            self=self||this;
            if(self.nrows>self.options.maxRows) {
                self.npages=Math.ceil(self.nrows/self.options.maxRows);
                self.$elem.find(".navi").remove();
                buttons="";
                for(i=1;i<=self.npages;i++) {
                    buttons+="<div class='beautableButton' data-page="+i+">"+i+"</div>";
                }
                self.$elem.find("tfoot td").append('<div class="floatedr navi">'+buttons+'</div>');
                self.buttonClicked($(".beautableButton").eq(0));
            }
        },
        addFiltrado: function(input) {
            var self=this;
            clearTimeout(self.timer);
            if(input.length>0) {
                self.timer=setTimeout(function() {
                    self.filtrar(input);
                },100);
                self.$elem.find("tfoot .navi").hide();
            } else {
                self.$elem.find("tfoot .navi").show();
                self.filtrar(input);
                self.addNav(self);
            }
        },
        filtrar: function(busqueda) {
            self=this;
            self.$elem.find("tbody tr").hide();
            self.$elem.find('tbody tr td:contains("'+busqueda+'")').filter(function() { $(this).parent().show(); });

        }

    };

    $.fn.beautable=function(options) {
        return this.each(function() {

            var beautable=Object.create(Beautable);
            beautable.init(options,this);
        });
    };

    $.fn.beautable.options={
        multicheck: true,
        showTotal: false,
        sumatorio: "",
        paginated: false,
        maxRows: 0,
        filtro: false
    };

})(jQuery,window,document);
...