更新 2
OP 正在使用类样式无法覆盖的原始应用程序。我从有关工具的各种线索中推断出(OP 含糊不清):
= 生成...HTML 表格
- 它使用内联样式
- 如果是这样,那么这将解释为什么使用类进行样式设计非常困难。
- 内联样式(例如 <div style='color:blue'>)不能被样式表中的规则集覆盖,甚至不能被 <style> 块覆盖,!important 是例外。 Demo 3将演示两种处理内联样式属性的方法。
$('td').on('click', function(e) {
var tgt = e.target;
e.stopImmediatePropagation();
$('td').each(function(idx, cell) {
cell.style.backgroundColor = '#fff';
cell.style.borderColor = '#000';
if ($(cell).hasClass('today')) {
cell.style.backgroundColor = 'rgba(0, 0, 255, 1)';
cell.style.borderColor = '#aae1ff';
}
});
tgt.style.backgroundColor = '#0093e0';
tgt.style.borderColor = '#09e';
});
-
e.target 是用户点击的<td>。
-
e.stopImmediatePropagation(); 防止事件冒泡并被任何其他侦听器听到。
-
$('td').each(function(idx, cell) {... 每个<td> 都会运行一个函数。
-
每个单元格(即<td>)都将其内联样式属性设置为:
cell.style.backgroundColor = '#fff';
cell.style.borderColor = '#000';
-
如果此特定单元格具有.today 类,则:
if ($(cell).hasClass('today')) {
cell.style.backgroundColor = 'rgba(0, 0, 255, 1)';
cell.style.borderColor = '#aae1ff';
}
-
for 循环完成后,更改e.target 样式:
tgt.style.backgroundColor = '#0093e0';
tgt.style.borderColor = '#09e';
更新 1
我误解了这个问题:OP 的期望行为是一次只有一个单元格可以拥有 .lit 类。使用.addClass()、.removeClass() 和.not() 可以轻松修改。请参阅演示 2。
/* Delegate the click event on all
|| td (cell).
|| Remove the .lit class on every <td>
|| and add .lit class for the clicked <td>
*/
$('td').on('click', function() {
var that = $(this);
$('td').not(that).removeClass('lit');
that.addClass('lit');
});
问题
"...但问题是 .off 的点击功能。它不会取消突出显示,因此所有表格单元格都会突出显示并持续存在。如何使用 jQuery 解决此问题?"
OP 提到的行为称为切换,它是在 2 个 “状态” 之间来回切换的能力(例如,状态处于 off 和 on,或 light 和 dark 等)。在这种情况下,它是 2 个背景的切换。
.on() 方法是一个添加事件监听器的函数on 任何给定的个人或元素组(例如$('td'))。
.off() 方法是一个删除任何给定单个或一组元素的事件侦听器关闭 的函数。 .off() 不会撤消 .on() 所做的任何事情,.off() 删除 .on()。所以每次点击<td> 都会丢失注册到它的事件监听器。
解决方案
- 避免使用
.css() 方法来设置一组元素的样式
- 操作类的效率要高得多。在这个演示中
.lit 是另一个状态,默认状态是<td> 没有类.lit
-
.toggleClass() 是用于执行此操作的方法。
以下演示中的主要功能解决了 OP 解释的问题。
作为奖励,我添加了以下功能:
详情在demo中注释
演示 1(切换类)
// Make a Date Object
var d = new Date();
// Get today's day as a number
var today = d.getDate();
/* Find the cell at the index number
|| (which is eq -1) and add thr .today class
*/
$('td').eq(today - 1).addClass('today');
/* On each cell, add the day number, unless
|| the cell has class .empty
*/ // Note: the syntax of string on line 19
// is ES6 Template Literal see post for ref.
$('td').each(function(index, day) {
if ($(this).hasClass('empty')) {
return
}
$(this).append(`<b>${index+1}</b>`);
});
/* Delegate the click event on all
|| td (cell).
|| callback on each td is to
|| toggle the .lit class
*/
$('td').on('click', function() {
$(this).toggleClass('lit');
});
.month {
table-layout: fixed;
width: 90%;
min-height: 250px;
border-spacing: 1px;
border: 3px outset grey
}
caption {
font-variant: small-caps
}
.month td {
border: 2px inset black;
background: #fff;
cursor: pointer;
}
td.lit {
background-color: #0093e0;
border-color: #09e;
}
td.today {
background: rgba(0, 0, 255, 1);
border-color: #aae1ff;
}
td.today.lit {
background: tomato;
border-color: red
}
td b {
font-size: .3em;
color: #123;
vertical-align: top;
display: inline-block;
margin: -7px 0 0 -5px;
}
td.today b {
color: #fff
}
.empty {
/* Prevents any mouse events
|| i.e unclickable
*/
pointer-events: none;
cursor: default;
}
<table class='month'>
<caption>October</caption>
<thead>
<tr>
<th>SUN</th>
<th>MON</th>
<th>TUE</th>
<th>WED</th>
<th>THU</th>
<th>FRI</th>
<th>SAT</th>
</tr>
</thead>
<tbody>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td class='empty' colspan='4'> </td>
</tr>
</tbody>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
Demo 2(专属类)
// Make a Date Object
var d = new Date();
// Get today's day as a number
var today = d.getDate();
/* Find the cell at the index number
|| (which is eq -1) and add thr .today class
*/
$('td').eq(today - 1).addClass('today');
/* On each cell, add the day number, unless
|| the cell has class .empty
*/// Note: the syntax of string on line 19
// is ES6 Template Literal see post for ref.
$('td').each(function(index, day) {
if ($(this).hasClass('empty')) {
return
}
$(this).append(`<b>${index+1}</b>`);
});
/* Delegate the click event on all
|| td (cell).
|| Remove the .lit class on every <td>
|| and add .lit class for the clicked <td>
*/
$('td').on('click', function() {
var that = $(this);
$('td').not(that).removeClass('lit');
that.addClass('lit');
});
.month {
table-layout: fixed;
width: 90%;
min-height: 250px;
border-spacing: 1px;
border: 3px outset grey
}
caption {
font-variant: small-caps
}
.month td {
border: 2px inset black;
background: #fff;
cursor: pointer;
}
td.lit {
background-color: #0093e0;
border-color: #09e;
}
td.today {
background: rgba(0, 0, 255, 1);
border-color: #aae1ff;
}
td.today.lit {
background: tomato;
border-color: red
}
td b {
font-size: .3em;
color: #123;
vertical-align: top;
display: inline-block;
margin: -7px 0 0 -5px;
}
td.today b {
color: #fff
}
.empty {
/* Prevents any mouse events
|| i.e unclickable
*/
pointer-events: none;
cursor: default;
}
<table class='month'>
<caption>October</caption>
<thead>
<tr>
<th>SUN</th>
<th>MON</th>
<th>TUE</th>
<th>WED</th>
<th>THU</th>
<th>FRI</th>
<th>SAT</th>
</tr>
</thead>
<tbody>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td class='empty' colspan='4'> </td>
</tr>
</tbody>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
演示3
// Make a Date Object
var d = new Date();
// Get today's day as a number
var today = d.getDate();
/* Find the cell at the index number
|| (which is eq -1) and add thr .today class
*/
$('td').eq(today - 1).addClass('today');
/* On each cell, add the day number, unless
|| the cell has class .empty
*/ // Note: the syntax of string on line 19
// is ES6 Template Literal see post for ref.
$('td').each(function(index, day) {
if ($(this).hasClass('empty')) {
return
}
$(this).append(`<b>${index+1}</b>`);
});
/* Delegate the click event on all
|| td (cell).
|| See post update for details
||
*/
$('td').on('click', function(e) {
var tgt = e.target;
e.stopImmediatePropagation();
$('td').each(function(idx, cell) {
cell.style.backgroundColor = '#fff';
cell.style.borderColor = '#000';
if ($(cell).hasClass('today')) {
cell.style.backgroundColor = 'rgba(0, 0, 255, 1)';
cell.style.borderColor = '#aae1ff';
}
});
tgt.style.backgroundColor = '#0093e0';
tgt.style.borderColor = '#09e';
});
.month {
table-layout: fixed;
width: 90%;
min-height: 250px;
border-spacing: 1px;
border: 3px outset grey
}
caption {
font-variant: small-caps
}
.month td {
border: 2px inset black;
background: #fff;
cursor: pointer;
}
td.lit {
background-color: #0093e0;
border-color: #09e;
}
td.today {
background: rgba(0, 0, 255, 1);
border-color: #aae1ff;
}
td.today.lit {
background: tomato;
border-color: red
}
td b {
font-size: .3em;
color: #123;
vertical-align: top;
display: inline-block;
margin: -7px 0 0 -5px;
background: rgba(0, 0, 0, 0);
pointer-events: none;
}
td.today b {
color: #fff
}
.empty {
/* Prevents any mouse events
|| i.e unclickable
*/
pointer-events: none;
cursor: default;
}
<table class='month'>
<caption>October</caption>
<thead>
<tr>
<th>SUN</th>
<th>MON</th>
<th>TUE</th>
<th>WED</th>
<th>THU</th>
<th>FRI</th>
<th>SAT</th>
</tr>
</thead>
<tbody>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td class='empty' colspan='4'> </td>
</tr>
</tbody>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
参考
时间
Date(),
.getDate()
DOM 集合
.eq(),
.each()
类操作
.toggleClass(),
.addClass(),
.removeClass(),
.hasClass()
事件委托
.on(),
.off()
杂项
.append(),
ES6 Template Literals
.not()