1

我有一个表,我添加了一些多项选择功能,shift + click在第一次单击和第二次单击之间选择行,但最终突出显示行之间的所有文本。

我不想通过 CSS 禁用文本选择,因为这些东西确实需要是可选的,而不是当我的多选功能触发时 shift + click 时。

这可以做到吗?

    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();
    });
4

2 回答 2

1

您可以尝试根据选中复选框的数量禁用用户选择。如果有,只需将 CSS 样式user-select: none;(和前缀版本)添加到#contact_table.

如果您提供带有当前 javascript 代码和表格的jsfiddle,我也会测试代码 - 现在它是原样;) 我不确定点击交互将如何与任何取消的事件冒泡等一起发挥作用。此外,即使选中了复选框,此实现也没有考虑到用户可能想要选择文本(因此它可能不是您要查找的内容)。

$(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;
}

编辑:改用更改事件。

于 2012-08-15T21:03:56.990 回答
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 ();
        }
    }
}
于 2012-08-15T21:47:40.217 回答