我有一个表格,我添加了一些多项选择功能,其中 shift + click 在第一次点击和第二次点击之间选择行,但最后突出显示行之间的所有文本。
我不想通过CSS禁用文本选择,因为这些东西确实需要是可选择的,而不是在我的多选功能触发时切换+单击时。
可以这样做吗?
var lastChecked;
$("#contact_table tr").click(function(e) {
if (e.target.getAttribute('type') == 'checkbox') {
return;
};
if (e.shiftKey && lastChecked) {
// select between last point and new point
var tableRows = $("#contact_table tr");
var newRow = tableRows.index($(this));
var oldRow = tableRows.index(lastChecked);
if (oldRow < newRow) {
newRow = newRow +1;
}
var sliceRange = [newRow, oldRow].sort();
var selectedRows = tableRows.slice(sliceRange[0], sliceRange[1])
.find('input[type=checkbox]').attr('checked', true);
} else {
var checkbox = $(this).find('input[type=checkbox]');
var checked = toggleCheckbox(checkbox);
if (checked) {
lastChecked = $(this);
}
};
recalculateSelectedButton();
});
答案 0 :(得分:1)
您可以尝试根据选中的复选框数禁用用户选择。如果有,只需将CSS样式user-select: none;
(和前缀版本)添加到#contact_table
。
如果您提供jsfiddle当前的javascript代码和表格,我也会对代码进行测试 - 现在它是原样的;)我不确定点击互动会如何与任何取消事件鼓泡等。此外,此实现没有考虑用户可能想要选择文本,即使有复选框(因此它可能不是您要查找的内容)。
$(function() {
var $contactTable = $("#contact_table"),
userSelectNoneClass = "user-select-none";
$contactTable.on("change", ":checkbox", function(e) {
var numberOfCheckedRows = $("#contact_table :checkbox:checked").length,
anyCheckedRows = (numberOfCheckedRows > 0);
if (anyCheckedRows && $contactTable.hasClass(userSelectNoneClass)) {
$contactTable.addClass(userSelectNoneClass);
} else {
$contactTable.removeClass(userSelectNoneClass);
}
});
});
.user-select-none
{
/* From https://stackoverflow.com/questions/826782/css-rule-to-disable-text-selection-highlighting */
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
编辑:改为使用更改事件。
答案 1 :(得分:1)
您可以使用javascript取消选择所有文字;运行多选逻辑后,添加对RemoveSelection()
的调用。
从http://help.dottoro.com/ljigixkc.php到Clear a selection in Firefox
function RemoveSelection () {
if (window.getSelection) { // all browsers, except IE before version 9
var selection = window.getSelection ();
selection.removeAllRanges ();
}
else {
if (document.selection.createRange) { // Internet Explorer
var range = document.selection.createRange ();
document.selection.empty ();
}
}
}