javascript - 单击 + CTRL 键选择一行,然后将 CSS 类添加到其下面的所有行,直到使用 JavaScript 找到具有另一个 CSS 类的行

标签 javascript jquery jquery-ui-sortable

我有一个 JavaScript 应用程序,其中包含项目任务记录,允许您拖放以重新定位排序顺序。

这是一篇包含代码和演示的详细帖子。我的问题在底部...

还有第二种类型的任务记录,它充当虚拟任务列表标题,以便您可以在任务之间拖放列表标题记录,以分隔和创建更有条理的任务列表。

此屏幕截图显示了一些点击和拖放功能,其中包括:

  • 单击任务行拖动 handle 会将 .selected CSS 类添加到该行,该类会更改背景颜色以显示其已“选定”。选择任务行后,您还可以单击并按住拖动 handle ,同时将行垂直拖动到新位置。
  • 按住 CTRL 键盘键并单击任务行拖动 handle 可以选择多行。选择多于 1 行后,您可以单击多行并将其拖放到新的排序顺序位置。
  • 选择 1 行或多行后,单击任何其他拖动 handle 将取消选择所有行,然后选择您单击的行。除非您按住 CTRL 键来执行多选功能。
  • 通过拖动 Tsk 标题行或任何相关行,您可以组织创建任务列表的顺序
<小时/>

演示 http://jsfiddle.net/jasondavis/xhmb2ba1/

<小时/>

enter image description here

<小时/>

JavaScript - 添加拖放 + 单击以选择多行

// Handle Project Task Drag and Drop Sorting on Task Edit Screen.
$("#project_tasks").on('click', '.handle', function (e) {
    if (e.ctrlKey || e.metaKey) {
        $(this).parent().toggleClass("selected");
    } else {
        $(this).parent().addClass("selected").siblings().removeClass('selected');
    }
}).sortable({
    handle: '.handle',
    placeholder: 'ui-state-highlight',
    delay: 150, //Needed to prevent accidental drag when trying to select
    revert: 0,
    helper: function (e, item) {
        var helper = $('<div/>');
        if (!item.hasClass('selected')) {
            item.addClass('selected').siblings().removeClass('selected');
        }
        var elements = item.parent().children('.selected').clone();
        item.data('multidrag', elements).siblings('.selected').remove();
        return helper.append(elements);
    },
    stop: function (e, info) {
        info.item.after(info.item.data('multidrag')).remove();
        $('.selected').removeClass('selected');
        updateSortOrderNumbers();
    }
});

function updateSortOrderNumbers(){
  showTaskUnSavedChangesHeaderBar();
  jQuery('.sortable div.task_row').each(function(idx) {
    var inputField = jQuery(this).find("[id^='sort_order']");
    jQuery(inputField).val(idx+1);
  });
}

HTML 结构

<div id="project_tasks" class="tasks_block sortable list ui-sortable" style="display: block;">

    <!-- TASK HEADING ROW -->
    <div id="task_11" class="heading-row task_row">
        <span class="handle" title="Drag and Drop to Reorder Tasks"></span>
        <input name="sort_order_11" id="sort_order_11" class="sort_order" size="15" type="hidden" value="1">
        <input name="heading_11" id="heading_11" class="heading" size="15" type="hidden" value="1">
        <input name="name_11" id="name_11" class="task-heading name" size="45" type="text" value="List Heading 1" placeholder="Type a Project Task List Heading Here..." style="cursor: auto; ">
         <br style="clear:both;">
    </div>

    <div id="task_12" class="task_row">
        <span class="handle" title="Drag and Drop to Reorder Tasks"></span>
        <input name="sort_order_12" id="sort_order_12" class="sort_order" size="15" type="hidden" value="2">
        <div class="task-name-wrap">
            <input class="name" name="name_12" id="name_12" placeholder="Name:" size="45" type="text" value="Task record 2">
        </div>
        <br style="clear:both;">
    </div>

    <div id="task_12" class="task_row">
        <span class="handle" title="Drag and Drop to Reorder Tasks"></span>
        <input name="sort_order_12" id="sort_order_12" class="sort_order" size="15" type="hidden" value="2">
        <div class="task-name-wrap">
            <input class="name" name="name_12" id="name_12" placeholder="Name:" size="45" type="text" value="Task record 3">
        </div>
        <br style="clear:both;">
    </div>

    <!-- TASK HEADING ROW -->
    <div id="task_11" class="heading-row task_row">
        <span class="handle" title="Drag and Drop to Reorder Tasks"></span>
        <input name="sort_order_11" id="sort_order_11" class="sort_order" size="15" type="hidden" value="1">
        <input name="heading_11" id="heading_11" class="heading" size="15" type="hidden" value="1">
        <input name="name_11" id="name_11" class="task-heading name" size="45" type="text" value="List Heading 2" placeholder="Type a Project Task List Heading Here..." style="cursor: auto; ">
         <br style="clear:both;">
    </div>


    <div id="task_12" class="task_row">
        <span class="handle" title="Drag and Drop to Reorder Tasks"></span>
        <input name="sort_order_12" id="sort_order_12" class="sort_order" size="15" type="hidden" value="2">
        <div class="task-name-wrap">
            <input class="name" name="name_12" id="name_12" placeholder="Name:" size="45" type="text" value="Task record 6">
        </div>
    </div>

    <div id="task_12" class="task_row">
        <span class="handle" title="Drag and Drop to Reorder Tasks"></span>
        <input name="sort_order_12" id="sort_order_12" class="sort_order" size="15" type="hidden" value="2">
        <div class="task-name-wrap">
            <input class="name" name="name_12" id="name_12" placeholder="Name:" size="45" type="text" value="Task record 7">
        </div>
    </div>


</div>
<小时/>

问题:新增“单击以选择任务列表中的所有任务”功能:

我想要做的是在任务标题行拖动选择器图像上添加 CTRL + Click 功能,并将其“选择”(添加 .select CSS 类)到所有任务行位于该任务标题行下方但下一个任务标题之前。

由于任务标题行与常规任务记录没有什么不同,因此没有父/子层次结构,因此事情变得复杂。上面的 HTML 显示有 2 个任务标题行。第一和第四。

因此,在第一个 Tash 标题行上 CTRL+Click 需要将 CSS 类 selected 添加到第 1、2 和 3 行,以选择任务标题行以及它的 2 个“子”行。

是否可以选择任务标题行的所有假子任务行?

现有功能演示:http://jsfiddle.net/jasondavis/xhmb2ba1/

<小时/>

更新:

我刚刚遇到这个 jQuery 函数 https://api.jquery.com/nextUntil/这可能是我的解决方案的门票

最佳答案

我刚刚遇到这个 jQuery 函数 https://api.jquery.com/nextUntil/这似乎是我的情况的正确选择。

CTRL+单击 任务标题时,此行会选择所有子项。

// select child task under a task row until next task row is reached
if ($(this).parent().hasClass('heading-row'))
{
    if ($(this).parent().hasClass('selected'))
    {
        $(this).parent().nextUntil(".heading-row" ).addClass("selected");
    }else{
        //$(this).parent().nextUntil(".heading-row" ).toggleClass("selected");
        $(this).parent().nextUntil(".heading-row" ).removeClass("selected");
    }
}

这里的工作演示:http://jsfiddle.net/jasondavis/xhmb2ba1/8/

enter image description here

关于javascript - 单击 + CTRL 键选择一行,然后将 CSS 类添加到其下面的所有行,直到使用 JavaScript 找到具有另一个 CSS 类的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30633014/

相关文章:

javascript - Google reCAPTCHA 数据回调不起作用

javascript - 设置 SharePoint Angular 人员选取器指令的值

jquery - JQuery数据表的rowReorder问题

php - jQuery 根据字符数更改 CSS 中的行高

javascript - jquery ajax 仅在 IE 中失败

javascript - AngularJS - 过滤对象中选定的属性

javascript - Chrome Websockets CORS 政策

jQuery UI 可排序表格和单元格在拖动 tr 时缩小

javascript - 如何在拖动时更改可排序元素的样式?

jquery - 在 JQuery 中拖放事件后返回元素的新顺序