2017-04-03 4 views
1

HTMLの表jQueryのセレクタは2つのドロップダウン

行#1のすべてのドロップダウン値、問題を取得するには:コル1 [Country DropDown] | コル#2 [StateDropDown]

ロウ#2:コル1 [Country DropDown] | コル2 [StateDropDown]

表はCountry & Stateのために、2 dropdownlistsを持っている - これは1つのドロップダウン、上で動作しますが、そのは他/状態のドロップダウンを無効にします! USAとアウスト・両方が同じ選択State ID /値3diff states selectedテキストが、col2 endupにしていながら

問題は、それゆえ私のコードは無効にされた(私はカリフォルニア州を選択した場合は、パースでも無効である!、ありますそれらは選択された値とテキストを比較してから重複している)この選択は、パース..

各行の両方の国の unique combination &状態としてこれを行うにはどのように
[USA]  -> [California] (value = 3) 
[Australia] -> [Perth]  (*also* has value= 3) so its disabled 

を無効にしますか?あるいは単にドロップダウンのテキストを比較する?...

  1. すなわちオプション1、両方Country ID + State ID Value already existかどうかを確認する方法?
  2. オプション2、単に選択したテキストを比較する(半分焼いた感じ)

JS Fiddle

// Javascript Does not disable States previously selected 
$("#CountryTable").on('change', '.State', function() { 
var dropDownText = $('#CountryTable .State select').not(this).map(function()    { 
return this.SelectedText; // does not work this.val() works but useless 
}).get(); 
var selectedValue = $(this).val(); 
var otherDropdowns = $('.State').not(this); 

otherDropdowns.find( 'オプション[値=' + SelectedValueの+ ']')。「(小道具無効 "、真)。 });


<table id="CountryTable"> 
<tbody id="CountryTableBody"> 
    <tr class="row"> 
     <td> 
      <select> 
       <option value="1">Country A</option> 
       <option value="2">Country B</option> 
       <option value="3">Country C</option> 
      </select>    
     </td> 

     <td> 
      <select> 
       <option value="1">State 1</option> 
       <option value="2">State 2</option> 
       <option value="3">State 3</option> 
       <option value="4">State 4</option> 
       <option value="5">State 5</option> 
      </select>    
     </td>   
    <tr> <!-- in JS prevent previous selection --> 
    <tr class="row"> 
     <td> 
      <select> 
       <option value="1">Country A</option> 
       <option value="2">Country B</option> 
       <option value="3">Country C</option> 
      </select>    
     </td> 
     <td> 
      <select> 
       <option value="1">State 1</option> 
       <option value="2">State 2</option> 
       <option value="3">State 3</option> 
       <option value="4">State 4</option> 
       <option value="5">State 5</option> 
      </select>    
     </td>   
    <tr>  
</tbody> 


***画像似たようなを表示する...正確ではない

Sample to show - prevent duplicate Combinations of the Cascading drowpdowns


+0

私は何かをしていると思います...しかし、遠すぎる前に:私は動的に何が作成されているかを知る必要があります。これまでは、最初の列(国)が動的ではないと仮定しました...そして、2列目の明らかに動的なオプションは忘れていました。 (笑)でも、私は何とか何かをしています。私は明日再び確認します。これは厄介なものです! –

+0

@LouysPatriceBessette 2つのケースで無効にすることはできません - 新しい行が動的に複製/追加されるとき - それらの行がテーブルに追加されるときには '1' '。 '2)'最初の実行時には、現在の '$ this dropdown'州や国で無効にすることができません。 *私はそのページ上の[すべてを集める](http://stackoverflow.com/a/27145521/6085193)の組み合わせが簡単で、同じ組み合わせの値を防ぐことができないのだろうかと疑問に思っています* – transformer

+0

あなたがイタリック体で書いたもの:私は... –

答えて

1

のThあなたがコピー/ペーストできる完璧なソリューションではありませんが、あなたが望むものに真実に近づいています。

Iは4つの引数で全体関数としてそれを作った:クローン化する隠れtableは、好ましくid、好ましくclass

  • td好ましくid
    1. table
    2. 新しい行button、好ましくはid

    自由に名前を付けてHTMLに書いておき、スクリプトでそれらの4つが使用されている複数の場所を修正する気にしないでください。

    これは単なる良いスタートです。
    実際、ユーザーが「国A」から「国B」に変更された場合、状態のドロップダウンは異なるはずです。

    これは私が残した唯一の問題です...これらのオプションをどのようにロードするのか分かりません。

    私は多くの時間をやめました...そのような "単純な"要求が複雑であるとは信じられないので、私はそれを行いました...私はそれを粉砕しなければなりませんでした
    ;)。

    ここにコード(JSのみ)と動作するCodePenのデモがあります。

    var excusiveSelect = function(tableID,rowCLASS,dummyID,cloneBtn){ // Preferably ID, CLASS, ID, ID 
    
        console.clear(); 
    
        // Cloning function 
        var cloneRow = function(){ 
        var newrow = $(dummyID).find(rowCLASS).clone(); 
        $(tableID).append(newrow); 
        refresh_mapping(); 
        }; 
    
        // Generate new lines 
        $(cloneBtn).on("click",cloneRow); 
    
        // ================================================================================ INITIALISATION 
        // Selection mapping 
        var row_count; 
        var row_map = {}; 
    
        // Get select clas names per colums 
        var col_count = $(rowCLASS).first().find("td").length; 
        var col_classes = []; 
        for(i=0;i<col_count;i++){ 
        col_classes[i] = $(document).find(rowCLASS).first().find("select").eq(i).attr("class").split(" ").join("."); 
        } 
        console.log("SELECT CLASSES: "+JSON.stringify(col_classes)); 
    
        var refresh_mapping = function(){ 
        row_count = $(document).find(rowCLASS).length-1; 
        console.log("ROWCOUNT: "+row_count); 
        for(i=0;i<row_count;i++){ 
    
         row_map["row_"+i] = {}; 
         $(tableID).find(rowCLASS).eq(i).find("select").each(function(index){ 
    
         // Get the select classes as object attribute. 
         var thisClasses = $(this).attr("class").split(" ").join("."); 
    
         // For each row/select get the selected index. 
         row_map["row_"+i][thisClasses] = $(this)[0].selectedIndex; 
         }); 
        } 
        console.log("VALUES MAPPING: "+JSON.stringify(row_map)); 
        } 
    
        cloneRow(); 
    
        // ================================================================================ FROM COLUMN #1 
    
        $(document).on("change","."+col_classes[0],function(){ 
        console.log("\n======================================================= Country change\n"); 
    
        refresh_mapping(); 
    
        // Disables options already selected in ALL col_classes[1] where col_classes[0] is the same 
        for(i=0;i<row_count;i++){ 
    
         if((row_map["row_"+i][col_classes[0]] == $(this)[0].selectedIndex) 
         && ( $(this).closest(rowCLASS).index() != i)){ 
    
         $(this).closest(rowCLASS).find("."+col_classes[1]+" option").eq(row_map["row_"+i][col_classes[1]]).attr("disabled",true); 
    
         // Else enable the option if not self 
         }else{ 
         if($(this).closest(rowCLASS).index() != i){ 
          $(this).closest(rowCLASS).find("."+col_classes[1]+" option").eq(i).attr("disabled",false); 
         } 
         } 
        } 
    
        }); 
    
        // ================================================================================ FROM COLUMN #2 
    
        $(document).on("change","."+col_classes[1],function(){ 
        console.log("\n======================================================= State change\n"); 
        console.clear(); 
        refresh_mapping(); 
    
        thisIndex = $(this)[0].selectedIndex;    // Option selectedIndex 
        thisRowIndex = $(this).closest(rowCLASS).index();  // Row index 
    
        // If same country... 
        var thisCol0index = $(this).closest(rowCLASS).find("."+col_classes[0])[0].selectedIndex; 
    
    
        $(tableID).find("."+col_classes[1]).each(function(){ 
         if($(this).closest(rowCLASS).find("."+col_classes[0])[0].selectedIndex == thisCol0index){ 
    
         // Zap tout les disabled 
         $(this).find("option:not(:eq(0))").attr("disabled",false); 
    
         // Use mapping to disable based on col_classes[0] 
         for(i=0;i<row_count;i++){ 
          if(row_map["row_"+i][col_classes[0]] == thisCol0index){ 
    
          $(this).find("option").eq(row_map["row_"+i][col_classes[1]]).attr("disabled",true); 
          } 
         } 
    
         } 
        }); 
        }); 
        // ================================================================================ 
    } 
    
    // Init! 
    excusiveSelect("#CountryTable",".row","#DummyTable","#newRow"); // Preferably ID, CLASS, ID, ID 
    
  • +0

    これを撮影してくれてありがとう。ええ、私は正しいことを知っています*このような単純な問題は私もあまりにも悩まされている* :)私はあなたのサンプルでも切り裂く問題がある(https://ibb.co/dbH6wF)私は写真を添付し​​ている..私は持っているあなたを賞賛してくれました。しかし、私はまだそれを必要としています...どうすればいいのか分かりません! – transformer

    +0

    あなたが見せているのは、私が残した「バグ」です。これは、同じ国のために既に選択されているかどうかを確認する国選択から2つの方法で無効にされるためです。他の選択(および同じ国)で選択されたオプションを無効にする状態選択から2-を選択します。国を変更すると、選択項目がリセットされません。そのため、これらのオプション要素を動的に変更する必要があります(SHOULD)。それが私が止まったところです。 –

    +0

    ここでは、[両方の値を取得する](http://jsfiddle.net/nooberz/Lr5pq/327/)への良いリンクです... – transformer