可排序列表+通过输入排名重新排序每个项目的能力#

时间:2011-04-16 09:34:09

标签: javascript jquery

我搜索并搜索了如何做到这一点,但无济于事。

基本上我有一个非常标准的jQuery可排序列表,使用抓手来允许用户重新排列列表

我想添加的是每个列表项的输入框,自动填充该项目的#,允许用户输入任意数字(只要它是< ==列表中的项目总数) <然后点击“Enter”或按一个按钮重新排序列表。

请参阅YouTube播放列表工具或Netflix队列作为我所指的内容的示例: http://img195.imageshack.us/img195/7715/youtubeplaylistrearrangc.png http://www.thedigeratilife.com/images/netflix-queue-big.jpg

我无法弄清楚这一点 - 非常感谢任何帮助!

戴夫

2 个答案:

答案 0 :(得分:15)

的jsfiddle:

http://jsfiddle.net/pMcmL/6/

HTML:

<ul id="sortable">
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 1
    </li>
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 2
    </li>
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 3
    </li>
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 4
    </li>
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 5
    </li>
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 6
    </li>
    <li class="ui-state-default">
        <span>&#x21C5;</span><input type="text"/>Item 7
    </li>
</ul>

CSS:

http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/themes/base/jquery-ui.css

+

li {
    margin: 1px;
    width: 130px;
    padding:2px;
    vertical-align:middle;
}

li span {
    color: gray;
    font-size: 1.1em;
    margin-right: 5px;
    margin-left: 5px;
    cursor: pointer;
    height:100%;
}

input[type="text"] {
    width: 32px;
    margin-right: 5px;
    border: 1px solid lightgay;
    color: blue;
    text-align: center;
}

使用Javascript:

sort_ul = $('#sortable');                  // * sortable <ul>
itemsCount = $('#sortable li').length;     // * total number of items
function updateIndexes() {                 // * function to update
    $('#sortable li input').each(          //   items numbering
      function(i) {
        $(this).val(i + 1);
    });
}
updateIndexes();                           // * start by update items numbering
sort_ul.sortable({handle: 'span',          // * apply 'sortable' to <ul>
                  stop: function(event, ui){
                          updateIndexes(); // * when sorting is completed,
                        }                  //   update items numbering
});
$('#sortable li input').keyup(             // * watch for keyup on inputs
  function(event) {
    if (event.keyCode == '13') {           // * react only to ENTER press
        event.preventDefault();            // * stop the event here
        position = parseInt($(this).val());// * get user 'new position'
        li = $(this).parent();             // * store current <li> to move
        if (position >= 1                  // * proceed only if
            && position <= itemsCount){    //   1<=position<=number of items
          li.effect('drop', function(){    // * hide <li> with 'drop' effect
            li.detach();                   // * detach <li> from DOM
            if (position == itemsCount)
              sort_ul.append(li);          // * if pos=last: append
            else                           //   else: insert before position-1
              li.insertBefore($('#sortable li:eq('+(position - 1)+')'));
            updateIndexes();               // * update items numbering
            li.effect('slide');            // * apply 'slide' effect when in
          });                              //   new position
        }else{ li.effect('highlight'); }   // * if invalid position: highlight
}}});

答案 1 :(得分:1)

这是通过更改数字来移动li项目的内容:

function setOrder() {
    $.each($('ul li input'), function(index, el) {
        el.value = (index + 1);
    });
}

setOrder();

$('ul li input').live('change', function() {
    var change = (parseInt(this.value) - 1);

    if(change > ($('ul li input').length - 1)){
        change = $('ul li input').length - 1; 
    }

    var index = $(this).index('ul li input');
    var move = $('ul li')[change];

    var arr = [];

    $.each($('ul li'), function(ind, el) {
        arr[ind] = $(this).clone();
    })
    arr[index] = move;
    $('input', move).val(index + 1);
    arr[change] = $(this).parent()[0];
    arr.sort();

    $('ul li').remove();
    var indexAt = 0;
    $.each(arr, function(index, el) {
        $('ul').append(el);
    });
    setOrder();
})
$('ul').sortable({
    stop: function(a, b) {
        var arr = [];
        var i = 0;
        $.each($('ul li'), function(ind, el) {
            arr[i] = $(this).clone();
            i++;
        })

        $('ul li').remove();
        $.each(arr, function(index, el) {
            $('ul').append(el);
        });
        setOrder()
    }
});

HTML:

<ul>
    <li><input/>lijrfxgjh</li>
    <li><input/>ghhgfhj</li>
    <li><input/>lijrjh</li>
    <li><input/>gfreydjgj</li>
    <li><input/>rey</li>
    <li><input/>gfjgf</li>
</ul>

小提琴:http://jsfiddle.net/maniator/bDvK8/

这有点毛躁,但这是一个开始