2013-08-20 3 views
0

Я пытаюсь сортировать раскрывающийся список (селектор) в html.Сортировка раскрывающегося списка

У меня есть два списка, предварительный выбор, который затем должен использоваться для определения содержимого списка secont.

Короткий пример кода:

<!doctype html> 
<html class=""> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 

</head> 

<body> 
<table width=100% border="0"> 
    <tr> 
    <td>&nbsp;</td> 
    <td>Product</td> 
    <td><select name="product" id="product" width="300" style="width: 300px"> 
     <option></option> 
     <option id="TLX">TLX</option> 
     <option id="FLX">FLX</option> 
     <option id="MLX">MLX</option> 
    </select></td> 
    <td>&nbsp;</td> 
    </tr> 
    <tr> 
    <td>&nbsp;</td> 
    <td>Power</td> 
    <td><select name="power" id="power" width="300" style="width: 300px"> 
     <option></option> 
     <option name="TLX">6</option> 
     <option name="TLX">8</option> 
     <option name="TLX">10</option> 
     <option name="TLX">12</option> 
     <option name="TLX">15</option> 
     <option name="FLX">6</option> 
     <option name="FLX">8</option> 
     <option name="FLX">10</option> 
     <option name="FLX">12</option> 
     <option name="FLX">15</option> 
     <option name="FLX">17</option> 
     <option name="MLX">30</option> 
     <option name="MLX">40</option> 
     <option name="MLX">60</option> 
    </select></td> 
    <td>&nbsp;</td> 
    </tr> 
</table> 

</body> 
</html> 

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

Например, если TLX выбран, то только 6, 8, 10, 12 и 15 показаны как возможности во втором списке.

+0

Просто регенерировать список со значениями, вам нужно, когда 'изменения product'. – Bart

ответ

2

с помощью ванили вы можете сделать, как показано ниже

посмотреть демо рабочий http://jsfiddle.net/ST5dq/

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

я буду использовать имя-данные

<table width=100% border="0"> 
    <tr> 
    <td>&nbsp;</td> 
    <td>Product</td> 
    <td><select name="product" id="product" width="300" style="width: 300px"> 
     <option></option> 
     <option id="TLX">TLX</option> 
     <option id="FLX">FLX</option> 
     <option id="MLX">MLX</option> 
    </select></td> 
    <td>&nbsp;</td> 
    </tr> 
    <tr> 
    <td>&nbsp;</td> 
    <td>Power</td> 
    <td><select name="power" id="power" width="300" style="width: 300px"> 
     <option></option> 
     <option data-name="TLX">6</option> 
     <option data-name="TLX">8</option> 
     <option data-name="TLX">10</option> 
     <option data-name="TLX">12</option> 
     <option data-name="TLX">15</option> 
     <option data-name="FLX">6</option> 
     <option data-name="FLX">8</option> 
     <option data-name="FLX">10</option> 
     <option data-name="FLX">12</option> 
     <option data-name="FLX">15</option> 
     <option data-name="FLX">17</option> 
     <option data-name="MLX">30</option> 
     <option data-name="MLX">40</option> 
     <option data-name="MLX">60</option> 
    </select></td> 
    <td>&nbsp;</td> 
    </tr> 
</table> 

Вы можете использовать это, чтобы отсортировать список

function sortDropdownList(ddl){ 

    var options = [].slice.apply(ddl.options, [0]); 
    ddl.innerHTML = ""; 
    var sorted = options.sort(function(a,b){  
     return +(a.innerText) - +(b.innerText); 
    }); 

    for(var i = 0; i < sorted.length; i++){ 
     ddl.options.add(sorted[i]); 
    } 

} 

вам нужно пройти Dóm элемент, а не элемент JQuery.

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

на вас странице инициализации добавить код

var parentSelect = document.getElementById("product"); 
var childSelect = document.getElementById("power"); 
var options = [].slice.apply(childSelect, [0]); 
var emptyOption = options[0]; 
childSelect.innerHTML = ""; 

parentSelect.addEventListener("change", function(e){ 

    var selectedId = parentSelect.options[parentSelect.selectedIndex].id; 
    childSelect.innerHTML = ""; 
    childSelect.options.add(emptyOption); 
    for(var i = 0; i < options.length; i++){ 

     if(options[i].getAttribute("data-name") == selectedId){ 

      childSelect.options.add(options[i]); 

     } 
    } 

    sortDropdownList(childSelect); 

}); 
0

Вы должны каскадных DropDownList

Пожалуйста, посмотрите на это ссылки:

И Не вы можете найти другие ссылки о каскадных DropDownLists из поиска Google или другого ...

1

Если вы используете JQuery, можно выполнить следующим образом: Demo

$(document).ready(function(){  
    var powerOptions = $('#power option').hide(); 
    $('#product').change(function(){ 
     powerOptions.hide().filter('option[name=' + $(this).find('option:selected').val() + ']').show(); 
    }); 
}); 

Примечание: в раскрывающемся списке продукта измените атрибут id каждой опции для имени.

3

не было сделано никаких попыток быть кросс-браузер здесь ... Но есть только один браузер, я могу думать, что может дать вам неприятности :)

Demo

Код

var product = document.getElementById('product'); 
var power = document.getElementById('power'); 
var allOpts = power.getElementsByTagName('option'); 
var opts = { 
    empty: allOpts[0] 
}; 

// This builds three additional lists of options for each type of product 
// It relies on having a single attribute - if more are added, this logic 
// would need to be adjusted. 
for(var i = 1; i < allOpts.length; ++i) { 
    var name = allOpts[i].attributes[0].value; 

    opts[name] = opts[name] || []; 
    opts[name].push(allOpts[i]); 
} 

// Each time product is changed, just loop through based on the selected ID 
// and add those options to the power select list (removing all children first) 
product.addEventListener('change', function(evt) { 
    var val = evt.target.value; 

    power.innerHTML = ''; 
    power.appendChild(opts.empty); 
    for(var i = 0; i < opts[val].length; ++i) { 
     power.appendChild(opts[val][i]); 
    } 
}); 

Здесь представляет собой версию с использованием документа. Фрагмент:

Demo

DocumentFragment версия

var product = document.getElementById('product'); 
var power = document.getElementById('power'); 
var allOpts = power.getElementsByTagName('option'); 
var opts = { 
    empty: allOpts[0] 
}; 

// Appending to the doc fragment removes it from the live nodelist 
while(allOpts.length > 1) { 
    var name = allOpts[1].attributes[0].value; 

    opts[name] = opts[name] || document.createDocumentFragment(); 
    opts[name].appendChild(allOpts[1]); 
} 

product.addEventListener('change', function(evt) { 
    var val = evt.target.value; 

    power.innerHTML = ''; 
    power.appendChild(opts.empty); 
    power.appendChild(opts[val].cloneNode(true)); 
}); 

Update

С помощью всего лишь немного больше работы, это может быть сделано более общий характер - скажем, когда новые требования приходят в комментариях к первоначальному ответу :)

Дополнительные требования

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

<select name="continent" id="continent">' 
    <option value="IMAGES/maps/europe_gray.png" id="EU">Europe</option> 
    <option value="IMAGES/maps/europe_gray.png" id="AS">Asia</option> 
</select> 
<select name="country" id="country"> 
    <option></option> 
    <option name="EU" id="ALB" value="IMAGES/flags/al.png">Albania, Republic of</option> 
    <option name="AS" id="RUS" value="IMAGES/flags/ru.png">Russia</option> 
</select> 

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

Generic Controller Example

/* params { 
* master: id of the master select element 
* subord: id of the subordinate select element 
* mKey: name of the attribute holding the key in master that will be used to filter subordinate options 
* sKey: name of the attribute in subordinate that will be used to match against mKey 
*/ 
function selectController(params) { 
    var master = document.getElementById(params.master); 
    var subord = document.getElementById(params.subord); 
    var allOpts = subord.getElementsByTagName('option'); 
    var opts = { 
     empty: allOpts[0] 
    }; 

    // Appending to the doc fragment removes it from the live nodelist 
    while (allOpts.length > 1) { 
     var name = allOpts[1].getAttribute(params.sKey); 

     opts[name] = opts[name] || document.createDocumentFragment(); 
     opts[name].appendChild(allOpts[1]); 
    } 

    master.addEventListener('change', function (evt) { 
     var sel = master.options[master.selectedIndex]; 
     var mKey = sel.getAttribute(params.mKey); 

     subord.innerHTML = ''; 
     subord.appendChild(opts.empty); 
     subord.appendChild(opts[mKey].cloneNode(true)); 
    }); 
} 

selectController({ 
    master: 'product', 
    subord: 'power', 
    mKey: 'id', 
    sKey: 'name' 
}); 

selectController({ 
    master: 'continent', 
    subord: 'country', 
    mKey: 'id', 
    sKey: 'name' 
}); 
+0

блестящий простой ... Я сейчас пытаюсь использовать тот же код для аналогичной проблемы, где в первом ddl у меня есть все континенты мира, а во втором у меня есть все страны мира. Кодируется таким же образом, с тем, что у меня также есть атрибут value. Это не работает: S второй список всегда пуст – abbisDK

+0

< выберите name = "country" id = "country"> ' – abbisDK

+0

@abbisDK Я обновил приведенный выше код, чтобы показать пример более общего контроллера, который может быть повторно использован для других элементов. – dc5

Смежные вопросы