【问题标题】:Jquery plugin not work properly on multiple elementJquery 插件在多个元素上无法正常工作
【发布时间】:2018-07-25 03:37:24
【问题描述】:

我创建了自己的简单 jquery 插件,但是当我放置 2 个元素并在每个元素上调用插件时遇到了一些问题

我的js代码:

function fTable(element,options){
    self          = this;
    this.$element = $(element);
    this.table    = $(this.$element).find('table');
    this.thead    = $(this.table).find('thead');
    this.tbody    = $(this.table).find('tbody');
    coloumn       = options.coloumn;

    this.defaults = {

    }

    //Merge default options with user options
    this.options = $.extend(true, {}, this.defaults, options);
    this.init();
}

fTable.prototype = {
    init : function(){
        self = this;
        this.td = $(this.thead).find('tr td:first');
        $(this.td).html('<a class="add">Plus</a>');
        this.bindEvents();
    },

    bindEvents : function(){
        self = this;
        console.log(this.table);
        $(this.table).on('click', '.add', function(){
            $row =  '<tr>';
            $row += '<td></td>';

            $.each(coloumn, function(index, value){
                $row += '<td><input type="text" value="" name='+value.name+' '+value.prop+'></td>';
            });

            $row += '</tr>';
            console.log(self);
            $($row).appendTo(self.table);
            lastTR = $(self.tbody).find('tr:last');
            $(lastTR).find('td:first').html('<a class="remove">Remove</a>');
        });

        $(this.table).on('click', '.remove', function(){
            row = $(this).closest('tr');
            $(row).remove();
        });
    }
}

$.fn.fTable = function(options){
    return this.each(function(){
        new fTable(this,options);
    });
}

$('.crud').fTable({
        coloumn:[
            {'type':'text','name':'NIK','prop':'disabled'},
            {'type':'text','name':'NAME','prop':''},
        ]
    }); 

$('.crud2').fTable({
    coloumn:[
        {'type':'text','name':'NIK','prop':'disabled'},
        {'type':'text','name':'NAME','prop':''},
    ]
}); 

HTML:

<div class="crud">
    <table class="table table-bordered">
        <thead>
            <tr>
                <td style="width:10%"></td>
                <td>NIK</td>
                <td>Name</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td></td>
                <td>1</td>
                <td>Ardhi</td>
            </tr>
            <tr>
                <td></td>
                <td>2</td>
                <td>Mega</td>
            </tr>
        </tbody>
    </table>
</div>

<div class="crud2">
    <table class="table table-bordered">
        <thead>
            <tr>
                <td style="width:10%"></td>
                <td>NIK</td>
                <td>Name</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td></td>
                <td>1</td>
                <td>Zaphire</td>
            </tr>
            <tr>
                <td></td>
                <td>2</td>
                <td>Rexa</td>
            </tr>
        </tbody>
    </table>
</div>

问题是当我单击第一个表(class='crud')上的“加号”时,它会将新行添加到第二个表(class='crud2')而不是第一个表(class='crud')

有什么帮助吗?

【问题讨论】:

    标签: javascript jquery jquery-plugins


    【解决方案1】:

    您的范围有问题。在您的 bindEvents 原型函数中,您声明了 self=this 但您不是指当前范围。实际上,您到处都有范围问题。 Please review JavaScript scope.

    将该行更改为 var self 或更好的 let self 以获取函数范围,而不是任何更高(全局)或先前声明的 self。

    function fTable(element,options){
        let self      = this; // you omitted let or var here
        this.$element = $(element);
        this.table    = $(this.$element).find('table');
        this.thead    = $(this.table).find('thead');
        this.tbody    = $(this.table).find('tbody');
        this.column   = options.column; // it was omitted here also but for sake of consistency, I applied column as a member to fTable.
    
        this.defaults = {
    
        }
    
        //Merge default options with user options
        this.options = $.extend(true, {}, this.defaults, options);
        this.init();
    }
    
    fTable.prototype = {
        init : function(){
            let self = this; // omitted here too
            this.td = $(this.$element).find('tr td:first');
            $(this.td).html('<a class="add">Plus</a>');
            this.bindEvents();
        },
    
        bindEvents : function(){
            let self = this;
            $(this.table).on('click', '.add', function(){
                let $row =  '<tr>';
                $row += '<td></td>';
    
                $.each(self.column, function(index, value){
                    $row += '<td><input type="text" value="" name='+value.name+' '+value.prop+'></td>';
                });
    
                $row += '</tr>';
                $($row).appendTo(self.table);
                let lastTR = $(self.tbody).find('tr:last');
                $(lastTR).find('td:first').html('<a class="remove">Remove</a>');
            });
    
            $(this.table).on('click', '.remove', function(){
                let row = $(self).closest('tr');
                $(row).remove();
            });
        }
    }
    
    $.fn.fTable = function(options){
        var self = this; // and here
        return this.each(function(){
            new fTable(self,options);
        });
    }
    
    $('.crud').fTable({
            column:[
                {'type':'text','name':'NIK','prop':'disabled'},
                {'type':'text','name':'NAME','prop':''},
            ]
        }); 
    
    $('.crud2').fTable({
        column:[
            {'type':'text','name':'NIK','prop':'disabled'},
            {'type':'text','name':'NAME','prop':''},
        ]
    }); 
    

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2021-09-20
      • 2011-07-28
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2017-03-08
      相关资源
      最近更新 更多