2013-08-20 160 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> 

我想B,能夠選擇產品,然後必須將權力清單進行相應sortet。

例如,如果選擇了TLX,則在第二個列表中僅顯示6,8,10,12和15作爲可能性。

+0

剛再生與您需要的時候'product'變化值列表。 – Bart

回答

2

使用香草,你可以做類似下面

看到演示工作http://jsfiddle.net/ST5dq/

沒有使用name屬性,使用的數據名稱,值或其他屬性,name屬性不工作跨瀏覽器選項標籤...

我會用數據名

<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]); 
    } 

} 

你需要傳遞一個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); 

}); 
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]); 
    } 
}); 

這裏是使用documentFragment的版本:

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)); 
}); 

更新

只需一點點更多的工作,這可以更通用的 - 說,當新的需求進來註釋到原來的答案:)

附加要求

注意:我添加了空白選項元素以使解決方案更簡單。代碼也可以適用於處理它的缺失,但這將作爲讀者的練習。

<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我擁有所有世界大陸,第二個我擁有所有國家和世界。以同樣的方式編碼,同時我也有一個「值」屬性。它不起作用:S第二個列表總是空的 – abbisDK

+0

< select name =「country」id =「country」>' – abbisDK

+0

@abbisDK我已更新上面的代碼展示了一個可以重新用於其他元素的更通用的控制器的例子。 – dc5