先看效果:

要求:

  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. bzoj 2282 消防

    Written with StackEdit. Description 某个国家有\(n\)个城市,这\(n\)个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为\(z_i(z_i ...

  2. upper_bound函数,binary_check函数

    个人心得:二分的经典运用,刚开始就是upper_bound可能难以实现一点,还有就是要注意没找到的时候 lower_bound 返回大于等于key的第一个元素的下标.upper_bound 返回大于k ...

  3. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  4. call、apply、bind用法区别

    call call() 方法调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表). <p class="danger"> 注意:该方法的作用和 ...

  5. 监听文本框输入oninput和onpropertychange事件

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onkeydow ...

  6. Base64加密算法

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Ba ...

  7. Jave 文件介绍

    Java程序的基本组成单元是类,有class声明,类体中包括属性和方法. 一个Java文件中可以有多个class声明,但由public修饰的类只能有一个,并且类名作为该文件的名称. 每一个应用程序都必 ...

  8. 【openCV学习笔记】【3】高斯模糊一张图片(_cvSmooth相关编译错误)

    代码如下: #include <iostream> #include <opencv/highgui.h> #include <opencv/cv.h> void ...

  9. gen_server的一些心得

    gen_server并不是我原来概念中的tcp_server或者udp_server的概念,只是一个纯粹的消息服务器,另外,附上它的一些回调函数的简单说明参考地址 http://hi.baidu.co ...

  10. SpringBean生命周期

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...