我的情况可能不典型,但我想做的是让TABLE 中的某些列完全“惰性”:无法进入它们,也无法选择其中的任何内容。我从其他 SO 答案中发现类“不可选择”:
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
这实际上阻止了用户使用鼠标将焦点放在TD ...但我无法在 SO 上找到防止标签进入单元格的方法。我的TABLE 中的TDs 实际上每个都有一个DIV 作为他们唯一的孩子,并且使用console.log 我发现实际上DIVs 会获得焦点(没有焦点首先由@987654329 获得@)。
我的解决方案涉及跟踪“先前关注的”元素(页面上的任何位置):
window.currFocus = document;
//Catch any bubbling focusin events (focus does not bubble)
$(window).on('focusin', function () {
window.prevFocus = window.currFocus;
window.currFocus = document.activeElement;
});
如果没有这种机制,我真的看不出你会怎么过...对各种用途都非常有用...当然,将它转换为最近的堆栈也很简单重点元素,如果你想要...
最简单的答案就是这样做(对每个新创建的TD 中唯一的DIV 孩子):
...
jqNewCellDiv[ 0 ].classList.add( 'unselectable' );
jqNewCellDiv.focus( function() {
window.prevFocus.focus();
});
到目前为止一切顺利。应该清楚的是,如果您只有一个 TD(没有 DIV 孩子),这将起作用。
小问题:这只是停止在其轨道上死板。显然,如果表格在该行或下面的行中有更多单元格,您想要的最明显的操作是使制表符选项卡到下一个不可选择的单元格......在同一行上,或者,如果有其他行,在下面的行上。如果它是表格的最后,它会变得更加棘手:即标签应该去哪里。但一切都很好干净的乐趣。