排序下拉列表
Sort dropdown list
我正在尝试对html中的dropdownlist(选择器)进行排序。
我有两个列表,一个预选,然后应该用来定义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> </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> </td>
</tr>
<tr>
<td> </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> </td>
</tr>
</table>
</body>
</html>
我想能够选择产品,然后必须对电源列表进行相应的排序。
例如,如果选择TLX,则在第二列表中仅显示6、8、10、12和15作为可能性。
这里没有尝试跨浏览器……但我能想到的只有一个浏览器可能会给你带来麻烦:)
演示
代码
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]);
}
});
以下是使用documentFragment:的版本
演示
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));
});
更新
只要再做一点工作,这就可以变得更通用——比如当新的需求出现在对原始答案的评论中时:)
附加要求
注意:我添加了空选项元素以使解决方案更简单。代码也可以进行调整以处理没有它的情况,但这将留给读者练习
<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>
通过以下更改,控制器逻辑现在更加通用,因为它可以通过接受附加信息来适应标记,该附加信息告诉它在哪里找到键和选择元素。
通用控制器示例
/* 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'
});
使用香草,你可以像下面的一样
查看演示工作http://jsfiddle.net/ST5dq/
没有使用名称属性,使用数据名称、值或其他属性,名称属性不能跨浏览器工作到选项标记。。。
我将使用数据名称
<table width=100% border="0">
<tr>
<td> </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> </td>
</tr>
<tr>
<td> </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> </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]);
}
}
您需要传递一个dom元素,而不是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);
});
如果您使用的是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属性更改为name。
您需要级联下拉列表
请查看以下链接:
- jQuery级联下拉插件(最推荐的链接是该项目的Demo页面)
- jQuery的级联下拉插件
- 使用JQuery清除下拉列表
你可以从谷歌搜索或其他地方找到关于级联下拉列表的其他链接。。。
相关文章:
- 使用选项组对下拉列表进行排序
- 如何在角度js的自动完成下拉列表中对项目列表(按字母顺序)进行排序
- 选择下拉列表时,按角度中的多个字段排序
- 对添加的 atrribute 或 id 的下拉列表进行排序
- Jquery 对表行中的下拉列表进行排序
- 如何在 angularjs 中对下拉列表进行排序
- yii 使用下拉列表对 CListView 进行排序
- 使用下拉列表选择对列表.js中的项目进行排序
- 排序下拉列表
- 如何使用下拉列表根据DateTransaction对其进行排序?
- 如何显示带有排序的下拉列表的页面
- 根据下拉列表的内容进行排序
- 为什么这个下拉列表的排序工作在Internet Explorer,而不是在Chrome
- 用javascript排序下拉列表
- 另一种排序JSON文件的方法,或者至少是使用javascript的下拉列表
- 将下拉列表与可单击的排序列表相结合
- 按字母顺序排序php/html表单中的下拉列表值
- 在javascript中按值而不是文本对选择下拉列表进行排序
- 排序语言的下拉列表为本地化Chrome扩展
- 如何从客户端(Javascript)重新排序下拉列表控件,如NetFlix队列