2015-10-22 10 views
5

他の入力フィールドを変更した後、複数の入力フィールドに変更を適用するためにjQueryを使用する最良の方法を考え出すのに問題があります。以下のコードは、キャンペーンIDが1つしかない場合に機能しています。しかし、複数のキャンペーンが存在する場合、私のコードは最後のインスタンスをすべてのキャンペーンに適用するだけです。 これを変更して各キャンペーンIDに個別に適用するにはどうすればよいですか?複数のオブジェクトにプロパティを適用する


GOALS

組織の状態を '一時停止' に 'アクティブ' から切り替えています。各キャンペーンIDの

  • 無効にキャンペーンのステータスは、ドロップダウン。
  • キャンペーンステータスが「更新済み」の場合は、「更新済み」のままにしてください。
  • キャンペーンステータスが[アクティブ]の場合は、[一時停止]に切り替えます。
  • キャンペーンステータスが[一時停止]の場合は、[一時停止]のままにします。

組織ステータスが[一時停止]から[有効]に切り替わります。各キャンペーンIDの

  • 有効にキャンペーンのステータスは、ドロップダウン。
  • ステータスを変更しません。ここで

コードは(テーブルを無視してください!)である:

var campaign_status = function() { 
 
    // If the Organization Status is set to 'Paused' and the Campaign is 'Active', make the campaign status 'Paused' and disable the drop down. 
 
    if ($('#orgautorenewstatus').val() == "Pause" && $('.autorenewstatus').val() == "Active") { 
 
     $('.autorenewstatus').prop('disabled', 'disabled'); 
 
     $('.autorenewstatus').val("Pause"); 
 
    } 
 
    // If the Organization Status is set to 'Paused' and the Campaign is 'Paused' or 'Renewed', leave the Campaign Status and disable the drop down. 
 
    else if ($('#orgautorenewstatus').val() == 'Pause') { 
 
     $('.autorenewstatus').prop('disabled', 'disabled'); 
 
    } 
 
    else { 
 
     $('.autorenewstatus').prop('disabled', false); 
 
    } 
 
}; 
 
$(campaign_status); 
 
$("#orgautorenewstatus").change(campaign_status);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h3>Organization Status</h3> 
 
<select id="orgautorenewstatus" name="orgautorenewstatus"> 
 
    <option value="Active" selected="selected">Active</option> 
 
    <option value="Pause">Paused</option> 
 
</select> 
 

 
<br /> 
 
<br /> 
 

 
<h4>Campaign Status</h4> 
 
<table> 
 
    <tbody> 
 
     
 
     <tr> 
 
      <td>#1</td> 
 
      <td> 
 
       <select class="autorenewstatus" name="autorenewstatus_48622"> 
 
        <option value="Pause">Paused</option> 
 
        <option value="Active" selected="selected">Active</option> 
 
        <option value="Renewed">Renewed</option></select> 
 
      </td> 
 
     </tr> 
 

 
     <tr> 
 
      <td>#2</td> 
 
      <td> 
 
       <select class="autorenewstatus" name="autorenewstatus_48884"> 
 
        <option value="Pause">Paused</option> 
 
        <option value="Active">Active</option> 
 
        <option value="Renewed" selected="selected">Renewed</option> 
 
       </select> 
 
      </td> 
 
     </tr> 
 
     
 
     <tr> 
 
      <td>#3</td> 
 
      <td> 
 
       <select class="autorenewstatus" name="autorenewstatus_49000"> 
 
        <option value="Pause">Paused</option> 
 
        <option value="Active" selected="selected">Active</option> 
 
        <option value="Renewed">Renewed</option> 
 
       </select> 
 
      </td> 
 
     </tr> 
 
     
 
    </tbody> 
 
</table>

簡単に、より簡単な方法がなければなりません。 jQueryの新機能ですが、できるだけ早くそれを拾い上げてくださいありがとうございました!

参照フィドル:複数のキャンペーンのために http://jsfiddle.net/riverecho/40087wdb/8/

+0

だからあなたの質問は何ですか?具体的には? –

+0

キャンペーンIDが1つだけの場合、上記のコードは機能しています。それでも、複数のキャンペーンが存在する場合、上記のコードは最後のインスタンスをすべてのキャンペーンに適用するだけです。これを変更して各キャンペーンIDに個別に適用するにはどうすればよいですか?私は最初の投稿も更新します。 – riverecho

+1

[.each()](https://api.jquery.com/each/) – dippas

答えて

2

まず、あなたのjQueryオブジェクトをキャッシュです。エレメントとのインターフェースが必要なたびに、新しいjQueryオブジェクトを作成する必要はありません。

しかし、複数のキャンペーンで使用する場合、コードがひどく振る舞う二つの理由があります。

  1. あなたは#orgautorenewstatusのidの代わりにクラスを使用しましたが。
  2. 各キャンペーンは、HTML内の独自の範囲に存在する必要があります。

この問題を解決するには、各キャンペーンを別のdiv要素にラップし、IDをクラスに変更します。次に、キャンペーンを繰り返し、各キャンペーンにスクリプトを適用します。

スクリプト内で現在操作されているキャンペーン内の要素のみを参照している要素を選択していることを確認してください。

$('.campaign').each(function(){ 
 
    var oars = $('.orgautorenewstatus', this); 
 
    var ars = $('.autorenewstatus', this); 
 
    var campaign_status = function() { 
 
     ars.prop('disabled', oars.val() === "Pause"); 
 
     if (oars.val() === "Pause") ars.each(function(){ 
 
      if(this.value === "Active") this.value = 'Pause'; 
 
     }); 
 
    }; 
 
    campaign_status(); 
 
    oars.change(campaign_status); 
 
});
/* For cosmetic purposes only */ 
 
.campaign { display: inline-block; width: 33%; } * { margin: 0; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- The HTML has been minified to save space --> 
 
<div class="campaign"><h3>Organization Status</h3><select class="orgautorenewstatus" name="orgautorenewstatus"><option value="Active" selected="selected">Active</option><option value="Pause">Paused</option></select><h4>Campaign Status</h4><table><tbody><tr><td>#1</td><td><select class="autorenewstatus" name="autorenewstatus_48622"><option value="Pause">Paused</option><option value="Active" selected="selected">Active</option><option value="Renewed">Renewed</option></select></td></tr><tr><td>#2</td><td><select class="autorenewstatus" name="autorenewstatus_48884"><option value="Pause">Paused</option><option value="Active">Active</option><option value="Renewed" selected="selected">Renewed</option></select></td></tr><tr><td>#3</td><td><select class="autorenewstatus" name="autorenewstatus_49000"><option value="Pause">Paused</option><option value="Active" selected="selected">Active</option><option value="Renewed">Renewed</option></select></td></tr></tbody></table></div><div class="campaign"><h3>Organization Status</h3><select class="orgautorenewstatus" name="orgautorenewstatus"><option value="Active" selected="selected">Active</option><option value="Pause">Paused</option></select><h4>Campaign Status</h4><table><tbody><tr><td>#1</td><td><select class="autorenewstatus" name="autorenewstatus_48622"><option value="Pause">Paused</option><option value="Active" selected="selected">Active</option><option value="Renewed">Renewed</option></select></td></tr><tr><td>#2</td><td><select class="autorenewstatus" name="autorenewstatus_48884"><option value="Pause">Paused</option><option value="Active">Active</option><option value="Renewed" selected="selected">Renewed</option></select></td></tr><tr><td>#3</td><td><select class="autorenewstatus" name="autorenewstatus_49000"><option value="Pause">Paused</option><option value="Active" selected="selected">Active</option><option value="Renewed">Renewed</option></select></td></tr></tbody></table></div><div class="campaign"><h3>Organization Status</h3><select class="orgautorenewstatus" name="orgautorenewstatus"><option value="Active" selected="selected">Active</option><option value="Pause">Paused</option></select><h4>Campaign Status</h4><table><tbody><tr><td>#1</td><td><select class="autorenewstatus" name="autorenewstatus_48622"><option value="Pause">Paused</option><option value="Active" selected="selected">Active</option><option value="Renewed">Renewed</option></select></td></tr><tr><td>#2</td><td><select class="autorenewstatus" name="autorenewstatus_48884"><option value="Pause">Paused</option><option value="Active">Active</option><option value="Renewed" selected="selected">Renewed</option></select></td></tr><tr><td>#3</td><td><select class="autorenewstatus" name="autorenewstatus_49000"><option value="Pause">Paused</option><option value="Active" selected="selected">Active</option><option value="Renewed">Renewed</option></select></td></tr></tbody></table></div>

0

、これはそれが私の感想になります。(id sが一意であることがあるので)この

<div class="campaignStatus">...</div>

のような独自のdivの中 ラップすべてのキャンペーンは

<select id="orgautorenewstatus" name="orgautorenewstatus" class="campaignBox">...</select>

VERSION 2(ドロップダウンボックスにクラスを割り当てます。改善済み:updated fiddleを参照)

特定のキャンペーンのアイテムにのみ影響するV(代わりに、すべてのキャンペーンをループの)

$(".campaignBox").on('change', function() { 
     // If the Organization Status is set to 'Paused' and the Campaign is 'Active', 
     // make the campaign status 'Paused' and disable the drop down. 
     if ($(this).val() === "Pause") { 

      //for each autorenew status within the campaign 
      $(this).closest('.campaignStatus').find('.autorenewstatus').each(function (i, box) { 
       if ($(box).val() == "Active") { 
        $(box).val("Pause"); 
       } 
      }); 
      $(this).closest('.campaignStatus').find('.autorenewstatus').prop('disabled', 'disabled'); 
     } else { 
      // If the Organization Status is set to 'Paused' and the Campaign is 'Paused' or 'Renewed', 
      // leave the Campaign Status and disable the drop down. 
      $(this).closest('.campaignStatus').find('.autorenewstatus').prop('disabled', false); 
     } 
    }); 
-1

私はあなたのロジックを少し簡略化する必要があり、ここに私のワーキングサンプル

var campaign_status = function() { 
     var newStatus = $('#orgautorenewstatus').val() == "Pause"? 'disabled' : false; 
     $('.autorenewstatus').each(function(){ 
     if($(this).val() == "Active") {   
      $('.autorenewstatus').prop('disabled', newStatus); 
      $('.autorenewstatus').val("Pause"); 
     } else { 
      $('.autorenewstatus').prop('disabled', newStatus); 
     } 
     }); 

    }; 
    $(campaign_status); 
    $("#orgautorenewstatus").change(campaign_status); 

http://jsfiddle.net/wx5ksfkk/1/

+0

私はOPが何を求めているのか、複数のキャンペーンではうまくいくとは思わない – ochi

+0

私はOPを明確にするつもりですが、各キャンペーンには独自のidドロップダウンがありますorgautorenewstatus') – ochi

関連する問題