jQuery单击外部元素以向上或向下移动包含已选中复选框的无序列表项

时间:2015-02-05 01:22:04

标签: javascript jquery html checkbox checked

我需要一个“上移”按钮和一个“下移”按钮,它会将列表中的列表项(包含已选中的复选框)向上移动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());
});

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

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

答案 1 :(得分:0)

试试这个:

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