Mein 1. jQuery (Clone) Plugin - bitte mal drüberschauen

k3nguruh

Erfahrenes Mitglied
Hallo,

ich beschäftige mich seit kurzem mit jQuery und habe mir gedacht, dass ich mich an einem Plugin versuche.
Ok, Clone-Plugins gibt es sicher schon eine Menge, aber die die ich bis jetzt gefunden habe, erfüllen nicht alle meinen Zweck bzw. sind riesig aufgebläht, ....

Nun weiss ich aber nicht, ob mein Plugin so richtig (struckturiert) ist. Viele Informationen (in Deutsch) diesbezüglich konnte ich im Netzt nicht gerade finden. Und wenn ich mir Plugins angeschaut habe, waren die alle nicht nach der Good-Plugin Methods gestrickt.

Vll. kann hier mal ein jQuery Profi drüber schauen und mir vll. noch einige Verbesserungen mitteilen. Natürlich bin ich auch an andere Meinungen von "nicht" Profis interessiert, abgesehen von Sinnlos-Postings.

Funktionieren tut das Plugin jedenfalls so, wie es (für mich) soll.

HIER gehts zur Seite

PHP:
;(function($) {
    var methods = {
        //
        //
        init: function(options) {
            options = $.extend(true, {}, $.fn.cloneBox.defaults, options);

            return this.each(function() {
                var $cloneBox = $(this);

                $cloneBox.find('.cloneSpacer:first').css({'display': 'none'});

                $cloneBox.find('[cloneBtn="add"]').live('click', function(event) {
                    event.preventDefault();
                    methods._addRow($(this), $cloneBox, options);
                });

                $cloneBox.find('[cloneBtn="del"]').live('click', function(event) {
                    event.preventDefault();
                    methods._delRow($(this), $cloneBox, options);
                });

                $cloneBox.find('[cloneBtn="delAll"]').live('click', function(event) {
                    event.preventDefault();
                    methods._delAllRow($(this), $cloneBox, options);
                });
            });
        },
        //
        //
        _addRow: function($this, $cloneBox, options) {
            var $lastRow = $cloneBox.find('.cloneRow:last'),
                $newRow = $lastRow.clone(),
                cntRows = $cloneBox.find('.cloneRow').length;

            if (parseInt(options.limit) > 0 && cntRows == parseInt(options.limit))
                return;

            $('*', $newRow).each(function() {
                var $this = $(this),
                    attrIdFor = $this.attr('id') ? 'id' : 'for';

                // Neue id / for setzen
                if (/(\d+)$/.test($this.attr(attrIdFor)))
                    $this.attr(attrIdFor, $this.attr(attrIdFor).replace(/(\d+)$/, (parseInt(RegExp.$1) + 1)));

                // Neuen name setzen
                if (/\[(\d+)\]/.test($this.attr('name')))
                    $this.attr('name', $this.attr('name').replace(/\[(\d+)\]/, '[' + (parseInt(RegExp.$1) + 1) + ']'));
            });

            methods._clearFields($newRow);
            $newRow.insertAfter($lastRow).find('.cloneSpacer').css({'display': ''});
        },
        //
        //
        _delRow: function($this, $cloneBox, options) {
            var $delRow = $this.closest('.cloneRow'),
                cntRows = $cloneBox.find('.cloneRow').length;

            if (cntRows > 1)
            {
                $delRow.remove();
                $cloneBox.find('.cloneSpacer:first').css({'display': 'none'});
            }
            else
            {
                methods._clearFields($delRow);
            }
        },
        //
        //
        _delAllRow: function($this, $cloneBox, options) {
            $cloneBox.find('.cloneRow').each(function() {
                methods._delRow($(this), $cloneBox, options);
            });
        },
        //
        //
        _clearFields: function($cloneRow) {
            $(':input', $cloneRow).each(function() {
                var $this = $(this);
                switch($this.prop('type'))
                {
                    case 'text':
                    case 'password':
                    case 'textarea':
                    case 'select-one':
                    case 'select-multiple':
                        $this.val('');
                        break;
                    case 'checkbox':
                    case 'radio':
                        $this.attr('checked', false);
                        break;
                }
            });
        }
    };
    //
    //
    $.fn.cloneBox = 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 {
            $.error('Method ' +  method + ' does not exist on jQuery.cloneBox');
        }
    };
    //
    // extend options
    $.fn.cloneBox.defaults = {
        limit: ''
    };
})(jQuery);
 
Zuletzt bearbeitet:
Ich habe nochmal kleine Änderungen vorgenommen...
PHP:
;(function($) {
    var methods = {
        //
        //
        init: function(options) {
            options = $.extend(true, {}, $.fn.cloneBox.defaults, options);

            return this.each(function() {
                var $cloneBox = $(this);

                $cloneBox
                    .find('.cloneSpacer:first').hide().end()
                    .on('click', '[cloneBtn]', function(event) {
                        event.preventDefault();
                        switch($(this).attr('cloneBtn')) {
                            case 'add':
                                methods._addRow($(this), $cloneBox, options);
                                break;
                            case 'del':
                                methods._delRow($(this), $cloneBox, options);
                                break;
                            case 'delAll':
                                methods._delAllRow($(this), $cloneBox, options);
                                break;
                            default:
                                break;
                        }
                    });
            });
        },
        //
        //
        _addRow: function($this, $cloneBox, options) {
            var $lastRow = $cloneBox.find('.cloneRow:last'),
                $newRow = $lastRow.clone(),
                cntRows = $cloneBox.find('.cloneRow').length;

            if (parseInt(options.limit) > 0 && cntRows == parseInt(options.limit))
                return;

            $('*', $newRow).each(function() {
                var $this = $(this),
                    attrIdFor = $this.attr('id') ? 'id' : 'for';

                // Neue id / for setzen
                if (/(\d+)$/.test($this.attr(attrIdFor)))
                    $this.attr(attrIdFor, $this.attr(attrIdFor).replace(/(\d+)$/, (parseInt(RegExp.$1) + 1)));

                // Neuen name setzen
                if (/\[(\d+)\]/.test($this.attr('name')))
                    $this.attr('name', $this.attr('name').replace(/\[(\d+)\]/, '[' + (parseInt(RegExp.$1) + 1) + ']'));
            });

            methods._clearFields($newRow);
            $newRow.insertAfter($lastRow).find('.cloneSpacer').show();
        },
        //
        //
        _delRow: function($this, $cloneBox, options) {
            var $delRow = $this.closest('.cloneRow'),
                cntRows = $cloneBox.find('.cloneRow').length;

            if (cntRows > 1)
            {
                $delRow.remove();
                $cloneBox.find('.cloneSpacer:first').hide();
            }
            else
            {
                methods._clearFields($delRow);
            }
        },
        //
        //
        _delAllRow: function($this, $cloneBox, options) {
            $cloneBox.find('.cloneRow').each(function() {
                methods._delRow($(this), $cloneBox, options);
            });
        },
        //
        //
        _clearFields: function($cloneRow) {
            $(':input', $cloneRow).each(function() {
                var $this = $(this);
                switch($this.prop('type'))
                {
                    case 'text':
                    case 'password':
                    case 'textarea':
                    case 'select-one':
                    case 'select-multiple':
                        $this.val('');
                        break;
                    case 'checkbox':
                    case 'radio':
                        $this.attr('checked', false);
                        break;
                }
            });
        }
    };
    //
    //
    $.fn.cloneBox = 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 {
            $.error('Method ' +  method + ' does not exist on jQuery.cloneBox');
        }
    };
    //
    // extend options
    $.fn.cloneBox.defaults = {
        limit: ''
    };
})(jQuery);
 

Neue Beiträge

Zurück