【问题标题】:jQuery Click on an outside element to move unordered list items up or down that contain checked checkboxesjQuery 单击外部元素以向上或向下移动包含选中复选框的无序列表项
【发布时间】:2015-02-05 09:37:05
【问题描述】:

我需要一个“上移”按钮和一个“下移”按钮,它们会将列表项(包含选中的复选框)在列表中向上移动 1 个位置或向下移动 1 个位置,具体取决于它们单击的按钮。我看过几篇处理类似情况的帖子,但似乎都没有完全涵盖我需要的内容。我想坚持使用主 jquery.js 文件。

                <ul id="theList">
                    <li>
                        <label>
                            <span><input type="checkbox" name="CheckboxGroup1" value="checkbox" id="CheckboxGroup1_0" />Checkbox 1</span></label>
                    </li>
                    <li>
                        <label>
                            <span><input type="checkbox" name="CheckboxGroup1" value="checkbox" id="CheckboxGroup1_1" />Checkbox 2</span></label>
                    </li>
                    <li>
                        <label>
                            <span><input type="checkbox" name="CheckboxGroup1" value="checkbox" id="CheckboxGroup1_2" />Checkbox 3</span></label>
                    </li>
                </ul>
                <a href="#" id="moveUp">Move Up</a>
                <a href="#" id="moveDown">Move Down</a>

jQuery 代码:

$('#moveUp').click(function() {
    return !$('#theList li :checked').closest('li').insertBefore(this.prev());
});

$('#moveDown').click(function() {
    return !$('#theList li :checked').closest('li').insertAfter(this.next());
});

【问题讨论】:

    标签: javascript jquery html checkbox checked


    【解决方案1】:

    您可以使用以下内容:

    Example Here

    $('#moveUp').click(function() {
        var $checkedElement = $('#theList li :checked');
        $checkedElement.closest('li').insertBefore($checkedElement.closest('li').prev());
    });
    
    $('#moveDown').click(function() {
        var $checkedElement = $('#theList li :checked');
        $checkedElement.closest('li').insertAfter($checkedElement.closest('li').next());
    });
    

    一些笔记..

    • 您在非 jQuery 对象 this.prev()/this.next() 上使用了 jQuery 方法。应该是$(this).prev()/$(this).next()

    • $(this) 在当前范围内指的是 up/down 元素。您不想根据向上/向下按钮索引更改复选框元素的位置。您需要更改相对于复选框元素的位置,因此您可以使用 $checkedElement.closest('li').prev() 之类的内容。

    如果您希望在移动多个复选框元素时使用此功能,您可以使用:

    Example Here

    $('#moveUp').click(function() {
        var $checkedElement = $('#theList li :checked');
        $checkedElement.each(function () {
            $(this).closest('li').insertBefore($(this).closest('li').prev());
        });
    });
    
    $('#moveDown').click(function() {
        var $checkedElement = $('#theList li :checked');
        $($checkedElement.get().reverse()).each(function () {
            $(this).closest('li').insertAfter($(this).closest('li').next());
        });
    });
    

    【讨论】:

    • 谢谢@JoshCrozier,这很棒!我也很欣赏添加的注释。非常彻底。
    【解决方案2】:

    试试这个:

    $('#moveUp').click(function() {
        $('#theList li :checked').each(function() {
           var li = $(this).closest('li');
           var previous = li.prev();
           // avoid having the selected elements move over each other
           if (previous.length > 0 && previous.find(':checked').length <= 0)
               li.detach().insertBefore(previous);
        });
    });
    
    $('#moveDown').click(function() {
        // need to iterate in reverse order - starting from the last
        var selected = $('#theList li :checked');
        var reverse = $(selected.get().reverse());
        reverse.each(function() {
           var li = $(this).closest('li');
           var next = li.next();
           // avoid having the selected elements move over each other
           if (next.length > 0 && next.find(':checked').length <= 0)
               li.detach().insertAfter(next);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多