【问题标题】:Creating change function with jQuery iteration使用 jQuery 迭代创建更改函数
【发布时间】:2018-10-03 16:33:24
【问题描述】:

我的目标是能够为我创建的表单添加首选项...我创建了一个包含以下字段的对象数组...

var preferences =[{
  base_field:"field1",
  base_value:"1",
  preference_type:"change",
  target_field:"field2_div legend",
  target_value:"New Field 2 Legend"
},
{
  base_field:"field1",
  base_value:"2",
  preference_type:"change",
  target_field:"field2_div legend",
  target_value:"New Field 2 Legend"
}];

$.each(preferences, function(key, preference){
  var baseField = $("#" + preference.base_field);
  var baseValue = preference.base_value;
  var targetField = $("#" + preference.target_field);
  var targetValue = preference.target_value;
  
  if (preference.preference_type == 'change') {
    var originalValue = targetField.text();
    baseField.change(function(){
      if(baseField.val() === baseValue){
        targetField.text(targetValue);
      }
      if(baseField.val() !== baseValue){
        targetField.text(originalValue);
      }
    });
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div id="field1_div">
  <fieldset>
    <legend>Field 1 Legend</legend>
    <label for="field1">Field 1</label>
    <select id="field1" name="field1">
      <option value="" selected>Field 1</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
    </select>
  </fieldset>
</div>
<div id="field2_div">
  <fieldset>
    <legend>Default Field 2 Legend</legend>
    <input id="field2" type="text" name="field2">
  </fieldset>
</div>

我希望当 #field1 的值从“默认字段 2 图例”变为“新字段 2 图例”时更改为“1”或“2”,然后如果 field1 更改为非 '1' 或 '2' 的值,'#field2_div legend' 的文本将恢复为 'Default Field 2 Legend'

我的问题是当 field1 = "2" 时只有最后一个更改函数...我认为这是因为更改函数被覆盖了。关于如何重写它以获得更具可扩展性的方法的任何想法?

【问题讨论】:

  • 您正在创建两个更改事件处理程序,每个规则一个。它没有被覆盖。为什么同一个元素有两个基值偏好规则?
  • @Taplar 我需要能够将 '#field2_div legend' 的文本设置为 'New Field 2 Legend' 只要 1 或 2 是 '#field1' 的值 - 所以基值将是 1 或 2,因此有 2 条规则。
  • 您将两个更改事件绑定到同一个select,它们将被一一执行,因此您只会看到您绑定的最后一个事件的更改。
  • @SamCraven 肯定是因为你只需要一个包含两个字段的规则,一个用于它可以切换的每个基值?或者可能是一组基值,以增加灵活性?因为除此之外,您的规则是相同的,看起来就像是多余的重复。
  • @Hikarunomemory 关于如何将其重写为单个更改函数以检查所有首选项定义的基值并相应地更新目标字段的任何想法?

标签: javascript jquery arrays object foreach


【解决方案1】:

这样解决了...谢谢@ADyson!

var preferences =[{
  base_field:"field1",
  base_value:["1","2"],
  preference_type:"change",
  target_field:"field2_div legend",
  target_value:"New Field 2 Legend"
}];

$.each(preferences, function(key, preference){
  var baseField = $("#" + preference.base_field);
  var baseValue = preference.base_value;
  var targetField = $("#" + preference.target_field);
  var targetValue = preference.target_value;
  
  if (preference.preference_type == 'change') {
    var originalValue = targetField.text();
    baseField.change(function(){
      if($.inArray(baseField.val(), baseValue) > -1){
        targetField.text(targetValue);
      } else{
        targetField.text(originalValue);
      }
    });
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div id="field1_div">
  <fieldset>
    <legend>Field 1 Legend</legend>
    <label for="field1">Field 1</label>
    <select id="field1" name="field1">
      <option value="" selected>Field 1</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
    </select>
  </fieldset>
</div>
<div id="field2_div">
  <fieldset>
    <legend>Default Field 2 Legend</legend>
    <input id="field2" type="text" name="field2">
  </fieldset>
</div>

【讨论】:

    【解决方案2】:

    添加您的代码,如下所示

    $(function(){	
    	
    	$('#field1').change(function(){
    		if($.inArray($(this).val(), ['1','2']) >= 0){			
    			$('#field2_div').children().find('legend').text('New Field 2 Legend');
    		}else{
    			$('#field2_div').children().find('legend').text('Default Field 2 Legend');
    		}
    	});
    	
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div id="field1_div">
    	<fieldset>
    		<legend>Field 1 Legend</legend>
    		<label for="field1">Field 1</label>
    		<select id="field1" name="field1">
    			<option value="" selected>Field 1</option>
    			<option value="1">1</option>
    			<option value="2">2</option>
    			<option value="3">3</option>
    			<option value="4">4</option>
    		</select>
    	</fieldset>
    </div>
    <div id="field2_div">
    	<fieldset>
    		<legend>Default Field 2 Legend</legend>
    		<input id="field2" type="text" name="field2">
    	</fieldset>
    </div>

    【讨论】:

    • 这个答案有效,但它不是动态的偏好数组...不知道为什么你在 children() 之后使用 find()... 似乎是多余的。
    • 您可以创建一个数组并将值分配给该数组。你已经决定了正确的值,1和2..你可以分配。
    【解决方案3】:

    这是我在表单中动态更改值的方法。 我给你留下了一些工作来根据你的喜好定制它。

    <div id="field1_div">
        <fieldset>
            <legend>Field 1 Legend</legend>
            <label for="field1">Field 1</label>
            <select id="field1" name="field1">
                <option value="" selected>Field 1</option>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="4">4</option>
            </select>
        </fieldset>
    </div>
    <div id="field2_div">
        <fieldset>
            <legend>Default Field 2 Legend</legend>
            <input id="field2" type="text" name="field2">
        </fieldset>
    </div>
    
    <script>
        function formChanger(inputValue) {
            switch (inputValue) {
                case '1':
                    // do something for selection 1
                    console.log('selected 1');
                    break;
                case '2':
                    // do something for selection 2
                    console.log('selected 2');
                    break;
                case '3':
                    // do something for selection 2
                    console.log('selected 3');
                    break;
                case '4':
                    // do something for selection 2
                    console.log('selected 4');
                    break;
                default :
                    // Probably want to remove any of the first 4 options that may have been implemented already.
                    return null;
            }
        }
        $('#field1').change(function(){
            formChanger($(this).val());
    
        });
    </script>
    

    【讨论】:

    • 我认为开关不起作用,因为inputValue 在开关情况下是字符串"1" != 1
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2019-03-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多