先看效果:

要求:

  1. 全选,反选和取消

  2. 编辑模式下的全选,反选和取消

  3. 编辑模式下单选进入编辑状态,取消退出编辑状态

  4. 表格元素有可编辑,不可编辑,下拉选择

  5. 按住ctrl选择下拉框,下面的同列选项都随之改变

思路:

http://naotu.baidu.com/file/142f658e573dde744597a788fabf3a14​

代码:

html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .edit-mode{
            background-color: #b3b3b3;
            padding: 8px;
            text-decoration: none;
            color: white;
        }
        .editing{
            background-color: #f0ad4e;
        }
    </style>
</head>
<body>
    <div style="padding: 20px">
        <input type="button" onclick="CheckAll('#edit_mode', '#tb1');" value="全选" />
        <input type="button" onclick="CheckReverse('#edit_mode', '#tb1');" value="反选" />
        <input type="button" onclick="CheckCancel('#edit_mode', '#tb1');" value="取消" />
 
        <a id="edit_mode" class="edit-mode" href="javascript:void(0);"  onclick="EditMode(this, '#tb1');">进入编辑模式</a>
 
    </div>
    <table border="1">
        <thead>
        <tr>
            <th>选择</th>
            <th>主机名</th>
            <th>端口</th>
            <th>业务</th>
            <th>状态</th>
        </tr>
        </thead>
        <tbody id="tb1">
            <tr>
                <td><input type="checkbox" /></td>
                <td edit="true">v1</td>
                <td>v11</td>
                <td edit="true" edit-type="select" global-key="BUSINESS" sel-val="1" >车商会</td>
                <td edit="true" edit-type="select" global-key="STATUS" sel-val="1" >在线</td>
            </tr>
            <tr>
                <td><input type="checkbox" /></td>
                <td edit="true">v1</td>
                <td>v11</td>
                <td edit="true" edit-type="select" global-key="BUSINESS" sel-val="2">二手车</td>
                <td edit="true" edit-type="select" global-key="STATUS" sel-val="1">在线</td>
            </tr>
            <tr>
                <td><input type="checkbox" /></td>
                <td edit="true">v1</td>
                <td>v11</td>
                <td edit="true" edit-type="select" global-key="BUSINESS" sel-val="3">大保健</td>
                <td edit="true" edit-type="select" global-key="STATUS" sel-val="2">下线</td>
            </tr>
        </tbody>
    </table>
    <script src="js/jquery-2.1.4.min.js"></script>
    <script type="text/javascript" src="js/edit_row.js"></script>
</body>
</html>
js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
STATUS = [
    {'id': 1, 'text': "在线"},
    {'id': 2, 'text': "下线"}
];
 
BUSINESS = [
    {'id': 1, 'text': "车商会"},
    {'id': 2, 'text': "二手车"},
    {'id': 3, 'text': "大保健"}
];
function CheckAll(mode,tb){
    //1、选中checkbox
    //2、如果已经进入编辑模式,让选中行进入编辑状态
    //tb = #tb1
    //$(tb) = $('#tb1')
    $(tb).children().each(function(){
        //$(this)表示循环过程中,每一个tr,每一行数据
        var tr=$(this);
        var isChecked = $(this).find(':checkbox').prop('checked');
        if(isChecked==true){
 
        }else{
            $(this).find(':checkbox').prop('checked',true);
            //如果已经进入编辑模式,让选中行进入编辑状态;
            var isEditMode = $(mode).hasClass('editing');
            if(isEditMode){
                RowEditInMode(tr);
            }
        }
    });
}
function CheckCancel(mode,tb){
    //1、取消选中checkbox
    //2、如果已经进入编辑模式,行退出编辑状态;
    $(tb).children().each(function(){
        var tr=$(this);
        if(tr.find(':checkbox').prop('checked')){
            //移除选中
            tr.find(':checkbox').prop('checked',false);
 
            var isEditing=$(mode).hasClass('editing');
            if(isEditing == true){
                //当前行,退出编辑状态;
                RowEditOutMode(tr);
            }
        }
    });
}
function CheckReverse(mode,tb){
    if($(mode).hasClass('editing')){
 
        $(tb).children().each(function(){
            var tr = $(this);
            var check_box = tr.children().first().find(':checkbox');
            if(check_box.prop('checked')){
                check_box.prop('checked',false);
                //##################相似代码################
                RowEditOutMode(tr);
                //##########################################
            }else{
                check_box.prop('checked',true);
                //##################相似代码################
                RowEditInMode(tr);
                //##########################################
            }
        });
    }else{
        //
        $(tb).children().each(function(){
            var tr = $(this);
            var check_box = tr.children().first().find(':checkbox');
            if(check_box.prop('checked')){
                check_box.prop('checked',false);
            }else{
                check_box.prop('checked',true);
            }
        });
    }
}
function EditMode(ths,tb){
    var isEditing  = $(ths).hasClass('editing');
    if (isEditing){
        //当前为编辑模式,点击触发了此函数,退出编辑模式;把……
        $(ths).text("进入编辑模式");
        $(ths).removeClass('editing');
        $(tb).children().each(function(){
            var tr=$(this);
            if(tr.find(':checkbox').prop('checked')){
                RowEditOutMode(tr);
            }
        });
    }else{
        $(ths).text("退出编辑模式");
        $(ths).addClass('editing');
        $(tb).children().each(function(){
            //$(this)表示循环过程中,每一个tr,每一行数据
            var tr=$(this);
            var isChecked = $(this).find(':checkbox').prop('checked');
            if(isChecked==true){
                RowEditInMode(tr);
            }
        });
    }
}
function RowEditInMode(tr){
    tr.children().each(function(){
        var td=$(this);
        if(td.attr('edit')=='true'){
            if(td.attr('edit-type')=="select"){
                var all_values = window[td.attr('global-key')];
                var select_val = td.attr('select-val');
                select_val = parseInt(select_val);  //字符串转数字
                var options = "";
                $.each(all_values,function(index,value){
                    if(select_val == value.id){
                        options += "<option selected='selected'>"+value.text+"</option>";
                    }else{
                        options += "<option>"+value.text+"</option>";
                    }
                });
                var temp = "<select onchange='MultiChange(this);'>"+options+"</select>";
            }else{
                var text=td.text();
                var temp = "<input type='text' value='"+text+"' />" ;
            }
            td.html(temp);
        }
    });
}
function RowEditOutMode(tr){
    tr.children().each(function(){
        var td=$(this);
        if(td.attr('edit')=='true'){
            var inp = td.children(":first");
            var input_value = inp.val();
            td.text(input_value);
        }
    });
}
/*************************编辑模式中选择一个进行编辑***************************/
$(function(){
    $("#tb1").find(':checkbox').click(function(){
        var tr = $(this).parent().parent();
        if($("#edit_mode").hasClass('editing')){
            if($(this).prop("checked")){
                //当前行进入编辑状态
                RowEditInMode(tr);
            }else{
                //当前行退出编辑状态
                RowEditOutMode(tr);
            }
        }
    });
});
/*************************multi_select_change_ctrl***************************/
globalCtrlKeyPress = false;
//如果按下键盘的任意键,执行function
window.onkeydown = function(event){
    //console.log(event.keyCode);
    if(event && event.keyCode == 17){
        window.globalCtrlKeyPress = true;
    }else{
        window.globalCtrlKeyPress = false;
    }
};
function MultiChange(ths){
    //检测是否按下ctrl建
    if(window.globalCtrlKeyPress == true){
        //td所在的tr中的索引位置
        var index = $(ths).parent().index();
        var value = $(ths).val();
        $(ths).parent().parent().nextAll().find("td input[type='checkbox']:checked").each(function(){
            $(this).parent().parent().children().eq(index).children().val(value);
        });
    }
}

此代码效果:

链接:

视频路径:DAY16-作业剖析

课件路径:cmdb_plugin/demo_1.html(不全)

jQuery--后台主机列表编辑的更多相关文章

  1. 可以搜索到DedeCms后台文章列表文档id吗?或者快速定位id编辑文章

    我们在建站时有的时候发现之前的文章有错误了,要进行修改,但又不知道文章名,只知道大概的文章id,那么可以搜索到DedeCms后台文章列表文档id吗?或者快速定位文章id方便修改? 第一种方法:复制下面 ...

  2. jquery ajax中 php前台后台文件中编辑都是uft-8,返回数据还是乱码

    jquery ajax中 前台后台文件中编辑都是uft-8,返回数据还是乱码 解决如下: 在后台处理文件里面需要再加编辑 header("Content-Type:text/html;cha ...

  3. Jquery easyui开启行编辑模式增删改操作

    Jquery easyui开启行编辑模式增删改操作 Jquery easyui开启行编辑模式增删改操作先上图 Html代码: <table id="dd"> </ ...

  4. [转]Jquery easyui开启行编辑模式增删改操作

    本文转自:http://www.cnblogs.com/nyzhai/archive/2013/05/14/3077152.html Jquery easyui开启行编辑模式增删改操作先上图 Html ...

  5. saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)

    一.编写插件基类 1.目录结构 1.我是如何获知我有多少种系统? 当客户端第一连接过来的时候,我就已经把这些文件存下来了 ,存在到哪里了?存到数据库了 每次对主机发送命令的动作时,我从库里把数据取出来 ...

  6. 三.jquery.datatables.js表格编辑与删除

    1.为了使用如图效果(即将按钮放入行内http://www.datatables.net/examples/ajax/null_data_source.html) 采用了另一个数据格式 2.后台php ...

  7. 多行滚动jQuery循环新闻列表代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 在后台主机中托管SignalR服务并广播心跳包

    什么是后台主机 在之前的 Asp.NETCore 轻松学系列中,曾经介绍过一个轻量级服务主机 IHostedService ,利用 IHostedService 可以轻松的实现一个系统级别的后台服务, ...

  9. CMDB服务器管理系统【s5day90】:获取今日未采集主机列表

    1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...

随机推荐

  1. MyEclipse2014安装操作步骤+破解

    第一步 第二步 第三步 第四步 第五步 第六步 破解操作步骤 1.安装完成 MyEclipse2014(适用于 2013 等版本)后,不要打开软件.解压破解文件压缩包,得到一下文件列表:双击 run. ...

  2. [BZOJ5297][CQOI2018]社交网络

    bzoj luogu sol 就是求以\(1\)为根的生成树的数量. 直接矩阵树定理. code #include<cstdio> #include<algorithm> #i ...

  3. zju 校队选拔 被虐记

    选拔已经开始了三天才想起来写游记 QAQ.. 7.12 弱弱的Sky_miner来到了ZJU,过程中被热成狗... 然后见到了无数大二大三的大佬们,过程中被热成狗... 后来听靖哥哥说集训的注意事项, ...

  4. 洛谷 P2626 斐波那契数列(升级版)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数). 题目描述 ...

  5. Redis事件库源码分析

    由于老大在新项目中使用redis的事件库代替了libevent,我也趁着机会读了一遍redis的事件库代码,第一次读到“优美,让人愉快”的代码,加之用xmind制作的类图非常帅,所以留文纪念. Red ...

  6. 基于jwt和角色的访问控制方案-从0开始

    上一版本的构想:http://www.cnblogs.com/vhyc/p/7953779.html 缺陷:dubbo的filter里面不能注入mapper的bean,而且每次查询都访问数据库速度影响 ...

  7. 【ecmall】解决无法上传店铺logo和banner照片问题 (转)

    问题描述:在ecmall个人用户登录,点击用户中心-店铺设置-更换店标,上传一个jpg图像(图像符合规范)后,不能预览,而且在页面底部点击提交后没有上传成功.banner店铺条幅也是一样的情况,还有下 ...

  8. asp+jquery+ajax,asp后台程序执行不正常

    项目中前台页面通过jquery .ajax功能将关键数据传递到后台并写入数据库,调试中发现后台程序一直没有正常执行,后反复排查 发现asp程序中不能包含#include file语句

  9. 安卓apk包重复签名问题

    安卓数字签名指的是对apk包做文件摘要并加密,在安装apk包时做解密和验证以保证包体不被篡改.这里先普及下签名和验证流程.签名文件保存在apk包里META-INF目录下,包含3个文件: 1.后缀为MF ...

  10. nagios 监控shell脚本

    线上应用shell脚本 参考链接:http://os.51cto.com/art/201301/376725.htm 0--各方面都正常,检查成功完成. 1--资源处于警告状态.某个地方不太妙. 2- ...