jQuery .selectable(), всегда возвращает один и тот же идентификатор?

Ниже у меня есть этот маленький список:

<ul id="selectable">
    <li id='0'></li>
    <li id='1'></li> 
    <li id='2'></li>
    <li id='3'></li>
    <li id='4'></li>
</ul>
<span>You've selected:</span> 
<span id="select-result">none</span>.

В сочетании с JQuery, он должен получить id выбранного элемента:

<script>
    $(function() {
        $( "#selectable" ).selectable({
             stop: function() {
                 var result = $( "#select-result" ).empty();
                 $( ".ui-selected", this ).each(function() {
                     var index = $( "#selectable li" ).attr( 'id' );
                     result.append( index );
                 });
             }
        });
    });
</script>

Каждый раз, когда я нажимаю на элемент, он отображает: 0

Почему? Когда я щелкаю элемент списка во второй раз, он должен отобразить: 1 и т.д., что я сделал не так?

4 ответа

Решение

Почему так сложно? Почему бы не так:

$('#selectable li').on('click', function(){
    // set the value of the clicked li to the result div
    $('#select-result').text( $(this).html() );

    // And optional:
    // set all true's to false:
    $('li[data-selected="true"]').attr('data-selected', 'false');
    // Set the clicked item to true
    $(this).attr('data-selected', 'true');
});

Необязательная часть очень необязательна, ваш вопрос не нужен:)

В настоящее время он собирает первый узел в вашем $('#selectable li') так как он собирает много узлов, настройте его на:

$('#selectable li.ui-selected');

Скрипка - обратите внимание, я настроил идентификаторы на letter + number W3 Spec

<ul id="selectable">
    <li id='i0'>Zero</li>
    <li id='i1'>One</li>
    <li id='i2'>Two</li>
    <li id='i3'>Three</li>
    <li id='i4'>Four</li>
</ul>
<span>You've selected:</span>  <span id="select-result">none</span>

<script>
    $("#selectable").selectable({
        stop: function () {
            var result = $("#select-result").empty();
            $(".ui-selected", this).each(function () {
                var index = $("#selectable li.ui-selected").attr('id');
                result.append(index);
            });
        }
    });
</script>

Я модифицировал решение MackieeE, так как в нем отсутствует возможность выбора нескольких предметов. С помощью следующего кода это работает.

Также на скрипке: http://jsfiddle.net/CVks3/2/

$("#selectable").selectable({
stop: function () {
        var result = $("#select-result").empty();
        $(".ui-selected", this).each(function () {
            result.append(this.id);
        });
    }
});

это может быть проще

$('#selectable li').each(function(i) {
    $(this).on('click', function() {
        $(this).attr('data-selected', 'true').siblings('li[data-selected="true"]').attr('data-selected', 'false');
        $('#select-result').text(i);
    });
});

Тогда вам вообще не нужны идентификаторы, и вы можете выбрать $('#selectable li[data-selected="true"]') или $('#selectable li').eq($('#select-result').text())

как насчет отмены выбора?

Я просто укажу на слона в комнате и скажу, что это начинается с того, что ничего не выбрано, и, возможно, потребуется возможность вернуться назад.

Что-то вроде:

$('#selectable li').each(function(i) {//get eq
    $(this).on('click', function() {//on click
        if ($(this).attr('data-selected')==='true') {//if currently selected
            $(this).attr('data-selected', 'false');//unselect    
            $('#select-result').text('none');//no results
        } else {//if not currently selected
            $(this).attr('data-selected', 'true')//mark selected
            .siblings('li[data-selected="true"]').attr('data-selected', 'false');//unselect siblings
            $('#select-result').text(i);//change results
        }
    });
});

Сделал скрипку: http://jsfiddle.net/filever10/vm9C2/

Другие вопросы по тегам