使用jQuery向表添加行

时间:2011-05-20 05:18:32

标签: javascript jquery

我正在尝试为jQuery开发一个插件。这是我的第一个插件,我陷入了初始阶段。

我需要做以下事情:我需要从表中找到“添加行”链接并绑定到click事件。单击链接时,应通过克隆现有模板行来添加新行。最初隐藏模板行。

以下是HTML。

<table id='grid1'>
    <tr>
        <td><a href='#' id='add_row'>Add New Row</a></td>
    </tr>
    <tr>
        <td>
            <table id='data_table'>
                <tr><th>Col1</th><th>Col2</th><th>Col3</th></tr>
                <tr><td>Data1</td><td>Data2</td><td>Col3</td></tr>
                <tr id='template_row'>
                   <td><input type='text' /></td>
                   <td><input type='text' /></td>
                   <td><input type='text' /></td>
                </tr>
            </table>
        </td>
    </tr>
</table>

到目前为止我的jQuery:

(function($) {
  $.extend($.fn, {
    editableGrid: function() {
      function addRow() {
        //code to clone here but i need the instance of main table here ie grid1
      }
      this.find('#add_row').bind("click",addRow);
    }
  });   
})(jQuery);

5 个答案:

答案 0 :(得分:3)

您需要.detach()表格中的模板并将其放在工厂变量上,例如:

var factory = $('#template_row').detach();
factory.removeAttr('id'); // Suggestion for Tomalak

它将从表中隐藏(不是真的)。下一步是绑定点击你的链接,并在这里指定将去新的factory.clone项目。像:

$('button.new-link').click(function(){
  $('#data_table').append(factory.clone(true));
}); 

.clone()plugin authoring

中查看

答案 1 :(得分:2)

不需要plugin只需执行此操作:

$('#add_row').click(function(){
     var clone = $('#template_row').clone();
     clone.removeAttr('id');
     clone.appendTo('#data_table');
})

以下是演示:http://jsfiddle.net/Jw5TF/

答案 2 :(得分:2)

继续使用您当前的代码:

(function($) {
  $.extend($.fn, {
    editableGrid: function() {
      this.find("a.add_row").click(function () {
        var $table  = $(this).parent("table").find("table.data_table");
        var $newRow = $table.find("tr.template_row").clone();

        $newRow.removeClass("template_row"); // !!!
        $table.append($newRow);
        return false;
      });
    }
  });   
})(jQuery);

注释

  • 使用CSS类而不是ID - 只有这样你才能在一个页面上拥有多个“可编辑网格”
  • 使用bind()而不是使用此处click()
  • 没有任何好处
  • 您可以直接将函数作为参数传递 - 无需单独定义它们
  • 它可以提高可读性/清晰度以使用详细选择器("a.add_row"优于".add_row"
  • 在外部函数中,this指的是包含所有匹配元素的jQuery对象,因此click()将所有绑定在一起
  • 在内部函数中,this指的是一个单独的DOM元素(即点击的链接) - 这里一个jQuery对象!
  • 不要忘记从false函数返回click以防止浏览器默认行为
  • 使用$添加变量以表示它们包含jQuery对象是有用的

答案 3 :(得分:1)

$.fn.myTableTingPlugin = function() {
  var self = this;

  $(self).find(".template_row").hide(); // or use css class
  $(this).find(".add_row").click(function() { 
     // shuld probebly not use ids if its a plugin 
     // so i use a class here

     var newRow =  $(self).find(".template_row").clone();
     $(self).find(".data_table").append(newRow);
  });
}; 

答案 4 :(得分:1)

首先,不要使用id,类更好。双引号也更好。

<table class="extendableTable">
    <tr>
        <td><a href="#" class="extendLink">Add New Row</a></td>
    </tr>
    <tr>
        <td>
            <table id="data_table">
                <tr><th>Col1</th><th>Col2</th><th>Col3</th></tr>
                <tr><td>Data1</td><td>Data2</td><td>Col3</td></tr>
                <tr id='template_row'>
                   <td><input type="text" /></td>
                   <td><input type="text" /></td>
                   <td><input type="text" /></td>
                </tr>
            </table>
        </td>
    </tr>
</table>

插件的源代码:

(function($) {
    $.fn.extendableTable = function(options){
        var table = this;
        this.find('.extendLink').click(function(){
            table.find('.dataTable .templateRow:first').clone().appendTo(table.find('.dataTable'));
            return false;
        });
    }
})(jQuery);

然后你可以用这样的方式使用插件:

$('.extendableTable').extendableTable();