首先,在制作列表时,您应该使用正确的列表元素。您的 "待办事项" 列表符合定义为描述列表 (<dl>
),因此您应该使用它而不是 <div>
元素。
通过去掉类并创建颜色数组,您可以节省很多代码行。确保颜色以您想要显示的相同顺序排列。我们将使用此数组根据递增计数器设置背景颜色。
var colors = ['#b2d8b2', '#ffffb2', '#ffe4b2', '#ffb2b2', '#fff'];
你可以通过使用一个“工厂”函数来大大简化你的脚本,这个函数定义了一个作用域并构建了一个事件监听函数,并返回它。这样创建了一个安全的作用域,让每个监听函数都可以在其中驻留,并且我们可以定义变量,在事件之间存储信息。
在下面的代码片段中,我们定义了一个count
变量,每次单击时都会将其增加。我们使用增加的变量余数,通过模运算符%
除以颜色数组的长度。如果该数字小于数组长度,则返回该数字,否则将返回模除长度后的余数,使我们能够持续循环。
function todoItemListener() {
var count = 0;
return function () {
$(this).css({ 'background-color': colors[count++ % colors.length] });
}
}
那么,我们不再像平常一样分配函数声明(不使用括号),而是分配工厂函数的结果,只需添加括号,该函数将执行并返回生成的侦听器函数。这使我们能够添加任意数量的侦听器函数,因此如果您正在添加新的待办事项列表项,我们可以简单地构建另一个侦听器函数。
$('.todo-list dd').each(function () {
$(this).on('click', todoItemListener());
});
$('.add-item').on('click', function () {
var list = this.parentNode.parentNode;
$('<dd>To-do list item</dd>').appendTo(list).on('click', todoItemListener());
});
这种方法还允许您随意更改颜色数组。所以,如果在页面上选择了某个选项,另一种颜色可能会变得可用或不可用。
此外,为了获得更好的用户体验,我添加了CSS代码,使其在单击时停止选择文本(这可能会很烦人),并将光标更改为指针以增强交互性。
以下是完整演示,包括多个待办事项列表以展示它可以实现的功能。
var colors = ['#b2d8b2', '#ffffb2', '#ffe4b2', '#ffb2b2', '#fff'];
function todoItemListener() {
var count = 0;
return function () {
$(this).css({ 'background-color': colors[count++ % colors.length] });
}
}
$('.todo-list dd').each(function () {
$(this).on('click', todoItemListener());
});
$('.add-item').on('click', function () {
var list = this.parentNode.parentNode;
$('<dd>To-do list item</dd>').appendTo(list).on('click', todoItemListener());
});
.glyphicon-plus-sign {
font-size: 15px;
}
.todo-list {
background: #efefef;
padding: 3px;
}
.todo-list dd {
margin: 0;
text-align: left;
padding: 3px;
margin-bottom: 7px;
border: 1px solid;
border-color: #e8e7e7;
background-color: #fff;
}
.add-item, .todo-list dd {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
cursor: pointer;
}
.add-item {
float: right;
margin: 4px;
}
.todo-list dh::after {
content: "";
display: block;
clear: both;
}
.todo-list dh h3 {
float: left;
margin: 0px;
max-width: 100%;
overflow: hidden;
}
.wrp {
float: left;
width: 33.33333333%;
padding: 1px;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="wrp">
<dl class="todo-list" id="todo-list-1">
<dh>
<h3 class="center" contenteditable>To Do List 1</h3>
<span class="add-item glyphicon glyphicon-plus-sign"></span>
</dh>
<dd>To-do list item</dd>
<dd>To-do list item</dd>
<dd>To-do list item</dd>
</dl>
</div>
<div class="wrp">
<dl class="todo-list" id="todo-list-2">
<dh>
<h3 class="center">To Do List 2</h3>
<span class="add-item glyphicon glyphicon-plus-sign"></span>
</dh>
<dd>To-do list item</dd>
<dd>To-do list item</dd>
<dd>To-do list item</dd>
</dl>
</div>
<div class="wrp">
<dl class="todo-list" id="todo-list-3">
<dh>
<h3 class="center">To Do List 3</h3>
<span class="add-item glyphicon glyphicon-plus-sign"></span>
</dh>
<dd>To-do list item</dd>
<dd>To-do list item</dd>
<dd>To-do list item</dd>
</dl>
</div>