2013-02-12 67 views
0

我正在嘗試開發一個足球隊的功能,該功能將使用每個選手的選擇框存儲多達18名選手(11個首發球員和7個潛分者)。JavaScript while while循環獲得選擇選項並隱藏其他選擇框的選項

當從一個選擇框中選擇一個玩家時,他們應該隱藏在所有其他選擇框中,以停止用戶能夠再次選擇相同的玩家。

我已經寫了一個javascript/jquery函數來做這件事,但它非常長時間的囉嗦,我猜測最好的選擇使它更易於管理,而不是寫一段while循環,但我得到我自己試圖編碼它感到困惑。

當前的代碼(首發)可以在http://jsfiddle.net/aFDjS/

可以看出我是正確的思維是什麼,我需要做的是可能有嵌套在另一個while循環while循環忽略當計數像玩家號碼一樣這樣...

i = 1; 
playerNo = 1; 
while (i < 19) {   
    while (playerNo < 19 && i != playerNo) { 
     playerID = $("#player" + i + "Name option:selected").val(); 
     $("select#player" + playerNo + "Name >option").filter("[class='"+ playerID +"']").hide(); 
     $("select#player" + playerNo + "Name >option").filter("[class!='"+ playerID +"']").show(); 
     playerNo++; 
    } 
    i++; 
} 

這是否正確?

+0

爲什麼不存儲t他的玩家ID在複選框名稱中?這是訪問easyer,你可以使用'document.getElementsByName()'獲得所有相同名稱的複選框。 – 2013-02-12 11:04:34

回答

0

不,你應該使用for循環。

標準是在計數某物時使用for循環,當您等待事件或值更改時使用while循環。

這些for循環中的邏輯很難遵循,看起來不對。

但不管這個,要做到這一點最簡單的方法是使用jQuery的力量:

$(function() { 
    $("select").on("change", function() { 
     //reset to showing all the options 
     $("select option").show(); 

     //for each selected option 
     $("select option:selected").each(function() { 
      var optionSelected = this; 
      var playerID = $(this).attr("class"); 
      //hide the option in all the other dropdowns 
      $("option." + playerID).each(function() { 
       if(this != optionSelected) { 
        $(this).hide(); 
       } 
      }); 
     }); 
    }); 
}); 

工作示例這裏:

http://jsfiddle.net/4avwm/1/

+0

馬特太棒了!接下來的步驟是在每個替代品旁邊都有一個隱藏的選擇框,每次在陣容中選擇一名玩家時都會填充該選擇框。一旦選擇了一名玩家作爲替代者,下拉將會顯示在他們旁邊,以便他們可以選擇他們替換的玩家。 所以實質上這可能是你在這裏幫助我的反對,所以是使用select name/id來指定修改的最簡單的方法(例如,在我循環計數並設置名稱/身份證作爲subbedPlayer#我# - - 其中我是計數(12-18))? – CPB07 2013-02-12 15:43:16

0

那麼,不知道什麼是完整的程序概念,但我認爲你的解決方案有點矯枉過正。
我會給每個複選框的名稱(例如:"plr"+ID),我會附加一個onclick事件。當事件被觸發時,複選框會搜索同名的所有複選框並禁用它們。

function selectPlr(event) { 
    var other = document.getElementsByName(this.name); //Get element collection 
    for(var i=0; i<other.length; i++) { 
     if(other[i]!=this) { //Ignore itself 
     other[i].disabled = this.checked; //Disable if the player is picked, enable if unpicked 
     } 
    } 
} 

當然,類名可以用來代替:

var other = $("input."+this.className); 

這裏是active code

0

可能是這樣會給你的想法執行:http://jsfiddle.net/2jGDU/

$('#players').change(function() { 
    $('#pl_11').prepend($('option:selected', this).clone()); 
    $('option:selected', this).remove(); 
    if ($('option', this).length <= 8) { 
    $('option:first', this).remove(); 
    $('#sub').prepend($(this).html()); 
    $('option', this).remove(); 
    } 
});