zoukankan      html  css  js  c++  java
  • JQuery实现表格自动增加行,对新行添加事件

    实现功能:

    通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢;通过此程序实现表格动态增加行,一直保持最下面有多个空白行。

    效果:

    一:原始页面



    二:表1增加新行并绑定timepicker



    三:表2自动增加行,新行绑定timepicker



    源码

    HTML源码:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <link href="../Script/jquery-easyui-1.3.2/themes/default/easyui.css" rel="stylesheet" />
        <style>
            .autoRows{
                 350px; border:1px green solid;
            }
            .autoRows tbody tr td{
                border-bottom:1px green solid;
                margin:0px;
            }
            .autoRows thead{
                background-color:#8ec7d7;
            }
            .autoRows tfoot {
                background-color: #8ec7d7;
            }
        </style>
    </head>
    <body>
        <table border="0" cellspacing="0" id="table1" class="autoRows">
            <thead>
            <tr>
                <th>表头1</th>
                <th>表头1</th>
                <th>表头1</th>
            </tr>
            <tr>
                <th>表头2</th>
                <th>表头2</th>
                <th>表头2</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>
                    <input id="Button1" type="button" value="insertAfter" onclick="addrow(this);" /></td>
                <td>
                    <input id="Button3" type="button" value="Clear" onclick="$.fn.tableAutoRow.clearRowData(this, 2, 2, false);" /></td>
                <td>
                    <input id="Text2" type="text" value="aaaa" /></td>
            </tr>
            <tr>
                <td>
                    <input id="Button2" type="button" value="insertBefore" onclick="$.fn.tableAutoRow.insertRow(this,1,true,false);" /></td>
                <td>
                    <input id="Button4" type="button" value="Reset" onclick="$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></td>
                <td>
                    <input id="Text1" name="ttt" type="text" value="asdfasfasfdsd" /></td>
            </tr>
            <tr>
                <td>
                    <input id="Button5" type="button" value="insertBefore" onclick="$.fn.tableAutoRow.insertRow(this,1,true,false);" /></td>
                <td>
                    <input id="Button6" type="button" value="Reset" onclick="$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></td>
                <td>
                    <input id="Text3" type="text" name="Text3" /></td>
            </tr>
            </tbody>
            <tfoot>
                <tr>
                    <th>表尾1</th>
                    <th>表尾2</th>
                    <th>表尾3</th>
                </tr>
            </tfoot>
        </table>
        <div style="height:20px;"></div>
        <table border="0" cellspacing="0" id="table2" class="autoRows">
            <thead>
            <tr>
                <th>表头1</th>
                <th>表头1</th>
                <th>表头1</th>
            </tr>
            <tr>
                <th>表头2</th>
                <th>表头2</th>
                <th>表头2</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>
                    <input id="Button7" type="button" value="insertAfter" onclick="addrow(this);" /></td>
                <td>
                    <input id="Button8" type="button" value="Clear" onclick="$.fn.tableAutoRow.clearRowData(this, 2, 2, false);" /></td>
                <td>
                    <input id="Text4" type="text" value="aaaa" /></td>
            </tr>
            <tr>
                <td>
                    <input id="Button9" type="button" value="insertBefore" onclick="$.fn.tableAutoRow.insertRow(this, 1, true, false);" /></td>
                <td>
                    <input id="Button10" type="button" value="Reset" onclick="$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></td>
                <td>
                    <input id="Text5" name="ttt" type="text" value="asdfasfasfdsd" /></td>
            </tr>
            <tr>
                <td>
                    <input id="Button11" type="button" value="insertBefore" onclick="$.fn.tableAutoRow.insertRow(this, 1, true, false);" /></td>
                <td>
                    <input id="Button12" type="button" value="Reset" onclick="$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></td>
                <td>
                    <input id="Text6" type="text" name="Text3" /></td>
            </tr>
            </tbody>
            <tfoot>
                <tr>
                    <th>表尾1</th>
                    <th>表尾2</th>
                    <th>表尾3</th>
                </tr>
            </tfoot>
        </table>
    </body>
    </html>
    <script src="../Script/jquery-1.7.2.min.js"></script>
    <script src="../Script/jquery.tableAutoRow.js"></script>
    <script src="../Script/jquery-easyui-1.3.2/jquery.easyui.min.js"></script>
    <script src="../Script/jquery.timepicker.js"></script>
    <script type="text/javascript">
        $(function () {
            $(".autoRows").tableAutoRow(aaa);
            function aaa(row) {
                $(row).find(':text').timepicker();
            }
        });
        function addrow(obj) {
            $.fn.tableAutoRow.insertRow(obj);
        }
    </script>


    JS源码:

    /// <reference path="jquery-1.11.1.min.js" />
    
    
    //为表格主体添加单击事件,当单击时添加行数,使表格保持有n个空行
    (function ($) {
        $.fn.extend({
            tableAutoRow: function (rowfunction) {
                return $(this).each(function () {
                    var tb = this;
                    if (!(this.tagName.toUpperCase() == "TBODY")) {
                        if (!this.tBodies[0]) {
                            return;
                        } else {
                            tb = this.tBodies[0];
                        }
                    }
                    //记录当前行数
                    var rowsCount = tb.rows.length;
                    //添加一个隐藏行,为了避免事件重复绑定,后面新增行复制此行
                    var lastRow = tb.rows[tb.rows.length - 1];
                    if (!$(lastRow).is(":hidden")) {
                        var row = $(lastRow).clone(true, true);
                        $(row).insertAfter($(tb).find("tr:last")).hide();
                    }
                    //绑定事件到行、单元格,单击时添加行
                    $(tb).on('click', 'td,tr', function (e) { autoRows(e, rowfunction); });
                    //绑定事件到input元素,当获取焦点或者单击时添加行
                    $(tb).on('focus', 'input', function (e) { autoRows(e, rowfunction); });
                    //单击第一行,初始化
                    tb.rows[rowsCount - 1].click();
                    //对原有行添加事件
                    if (typeof (rowfunction) == 'function') {
                        for (var i = 0 ; i < rowsCount; i++) {
                            rowfunction(tb.rows[i]);
                        }
                    }
                });
            }
        });
        //自动增加行
        function autoRows(e, rowfunction) {
            var e = e || event;
            var obj = e.target || e.srcElement;
            while (obj.tagName != "TR") {
                obj = obj.parentNode;
            }
            var tb = obj.parentNode;
            var index = $(obj).index();
            var n = 5 - (tb.rows.length - index);
            if (n > 0) {
                var lastRow = tb.rows[tb.rows.length - 1];
                for (var j = 0; j < n; j++) {
                    var row = $(lastRow).clone(true, true);
                    //将新行添加到最后一行之前
                    row.insertBefore($(tb).find("tr:last")).show();
                    //如果有回调函数则执行
                    if (typeof (rowfunction) == 'function') {
                        rowfunction(row);
                    }
                }
            }
        }
    
    
        $.fn.tableAutoRow.deleteRow = function (obj) {
            if (!confirm('确定删除此行?')) {
                return;
            }
            var loop = 0;   //加入循环次数,防止死循环
            while (obj.tagName != "TR" && loop < 10) {
                obj = obj.parentNode;
                loop++;
            }
            if (obj.tagName != "TR") {
                return;
            }
            if (obj.parentNode.rows.length == 2) {
                alert('不能删除全部行');
                return;
            } else {
                $(obj).remove();
            }
        }
    
    
        //在表格中指定位置插入指定行数,新插入的行内容为同一表格主体最后一行
        //obj:行内的任意对象
        //n:要增加的行数
        //isInsertAfter:插入在当前行的后面,否则在前面
        $.fn.tableAutoRow.insertRow = function (obj, n, isInsertAfter) {
            var loop = 0;   //加入循环次数,防止死循环
            while (obj.tagName != "TR" && loop < 10) {
                obj = obj.parentNode;
                loop++;
            }
            if (obj.tagName != "TR") {
                return;
            }
            var tb = obj.parentNode;
            switch (arguments.length) {
                case 2:
                    var isInsertAfter = true;
                case 1:
                    var isInsertAfter = true;
                    var n = 1;
            }
            for (var i = 0; i < n; i++) {
                var lastRow = tb.rows[tb.rows.length - 1];
    
    
                var row = $(lastRow).clone(true, true);
                //将新行添加到当前行之前/后
                if (isInsertAfter) {
                    row.insertAfter(obj).show();
                } else {
                    row.insertBefore(obj).show();
                }
            }
        }
        //清除指定行数据
        //obj为行或者行内的节点
        //startColnum:起始列
        //endColumn:终止列
        //isReset:是否恢复到初始值
        $.fn.tableAutoRow.clearRowData = function (obj, startColnum, endColumn, isReset) {
            var loop = 0;   //加入循环次数,防止死循环
            while (obj.tagName != "TR" && loop < 10) {
                obj = obj.parentNode;
                loop++;
            }
            if (obj.tagName != "TR") {
                return;
            }
            var cellsCount = obj.cells.length;                  //此行单元格总数
            if (startColnum < 0 || !startColnum) {             //如果未指定清除起始列则从第一列清除
                startColnum = 0;
            }
            if (endColumn > cellsCount - 1 || !endColumn) {     //如果未指定清除终止列则清除到最后一列前(通常最后一列用于放置清除按钮)
                endColumn = cellsCount - 1;
            }
            if (isReset == undefined) {
                isReset = false;
            }
            for (var c = startColnum; c <= endColumn; c++)<span style="white-space:pre">		</span>//循环各列,设置单元格里的控件值
            {
                for (var j = 0; j < obj.cells[c].childNodes.length; j++) {  //循环处理指定单元格中的子节点
                    var node = obj.cells[c].childNodes[j];
                    setObjData(node, isReset);
                }
            }
        };
        function setObjData(node, isReset) {
            switch (node.type) {
                case "text":
                case "hidden":
                case "textarea":
                    if (isReset) {
                        node.value = node.defaultValue;
                    } else {
                        node.value = "";
                    }
                    break;
    
    
                case "select-one":
                case "select-multiple":
                    if (isReset) {
                        for (var k = node.options.length - 1; k >= 0; k--) {
                            node.options[k].selected = node.options[k].defaultSelected;
                        }
                    } else {
                        for (var k = node.options.length - 1; k >= 0; k--) {
                            //node.options.remove(k);
                            node.options[k].selected = false;
                        }
                    }
                    break;
                case "checkbox":
                case "radio":
                    if (isReset) {
                        node.checked = node.defaultChecked;
                    } else {
                        node.checked = false;
                    }
                    break;
            }
            if (node.childNodes && node.childNodes.length > 0) {
                var l = node.childNodes.length;
                for (var i = 0; i < l; i++) {
                    setObjData(node.childNodes[i], isReset);
                }
            }
        }
    })(jQuery);
    $(function(){
        $('.autoRows').tableAutoRow();
    });
    


  • 相关阅读:
    js函数调用模式
    js闭包和回调
    js原型
    oracle sql优化笔记
    shell脚本学习
    程序与资源管理
    vi/vim学习
    压缩和解压缩
    用户及用户组
    万用字符和特殊字符
  • 原文地址:https://www.cnblogs.com/apollokk/p/6713873.html
Copyright © 2011-2022 走看看