Как восстановить порядок (неполного) списка выбора в его первоначальном порядке? - PullRequest
4 голосов
/ 21 апреля 2010

У меня есть два списка выбора, между которыми вы можете перемещать выбранные параметры. Вы также можете перемещать опции вверх и вниз в правом списке.

Когда я перемещаю опции обратно в левый список, я бы хотел, чтобы они сохранили исходную позицию в порядке списка, даже если в списке отсутствуют некоторые оригинальные опции. Это сделано исключительно для того, чтобы сделать список более удобным для пользователя.

В настоящее время я определяю массив с исходной загрузкой списка выбора.

Как лучше всего это реализовать?

Ответы [ 2 ]

5 голосов
/ 21 апреля 2010

Вы можете сохранить исходный порядок в массиве и при вставке назад определить, какой самый последний элемент в массиве предшествует вставляемому элементу и соответствует текущему в списке выбора. Затем вставьте после этого.

Лучшее решение состоит в том, чтобы просто сохранить старый массив целиком и заново заполнить каждую вставку требуемыми элементами следующим образом (предупреждение: код не проверен)

function init(selectId) {
    var s = document.getElementById(selectId);
    select_defaults[selectId] = [];
    select_on[selectId] = [];
    for (var i = 0; i < s.options.length; i++) {
        select_defaults[selectId][i] = s.options[i];
        select_on[selectId][i] = 1;
        var value = list.options[i].value;
        select_map_values[selectId][value] = i if you wish to add/remove by value.
        var id = list.options[i].id; // if ID is defined for all options
        select_map_ids[selectId][id] = i if you wish to add/remove by id.
    }
}

function switch(selectId, num, id, value, to_add) { // You can pass number, value or id
    if (num == null) {
        if (id != null) {
            num = select_map_ids[selectId][id]; // check if empty?
        } else {
            num = select_map_values[selectId][value]; // check if empty?
        }
    }
    var old = select_on[selectId][num];
    var newOption = (to_add) : 1 : 0;
    if (old != newOption) {
        select_on[selectId][num] = newOption;
        redraw(selectId);
    }
}

function add(selectId, num, id, value) {
    switch(selectId, num, id, value, 1);
}

function remove(selectId, num, id, value) {
    switch(selectId, num, id, value, 0);
}

function redraw(selectId) {
    var s = document.getElementById(selectId);
    s.options.length = 0; // empty out
    for (var i = 0; i < select_on[selectId].length; i++) { 
        // can use global "initial_length" stored in init() instead of select_on[selectId].length
        if (select_on[selectId][i] == 1) {
            s.options.push(select_defaults[selectId][i]);
        }
    }
}
0 голосов
/ 21 апреля 2010

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

...