2016-01-22 70 views
1

这是我的问题的semplification。我想在输入字段后面(在更新同一字段时)附加一些文本,仅当select元素的值为IT时。jquery变量不更新更新

这就是字段:

<select id="billing_country"> 
    <option value="FR">FR</option> 
    <option value="IT">IT</option> 
</select> 

<input type="text" id="woocommerce_cf_piva"> 

这是脚本:

jQuery(document).ready(function() { 

var $country_select = jQuery('#billing_country'); 

// When country change 
$country_select.change(function() { 

    var $country = jQuery('#billing_country option:selected'); 

    $country.each(function() { 

     FieldCheck(jQuery(this).val()); 
    }) 
}); 

function FieldCheck($country) { 

    var $element = jQuery('#woocommerce_cf_piva'); 

    if ($country == 'IT') { 

     $element.change(function() { 

      $element.after($country); 
     }); 
    } 
} 
}); 

可以see this also on jsFiddle

为什么追加国家名称另外,如果我选择FR?

+0

当您执行FieldCheck并设置IT时,您正在添加新的事件处理程序;然后如果你改变了这个值,事件处理程序STAYS;即使价值变化... –

回答

0

我想补充一个跨度,将文本在那里等后续变化,你能解决这个问题:

<select id="billing_country"> 
    <option value="FR">FR</option> 
    <option value="IT">IT</option> 
</select> 
<input type="text" id="woocommerce_cf_piva" /><span id="afterit"></span> 

注意,这仍然是相当详细:

jQuery(document).ready(function() { 
    var $country_select = jQuery('#billing_country'); 
    var $element = jQuery('#woocommerce_cf_piva'); 

    // When country change 
    $country_select.on('change', function() { 
    var $country = jQuery(this).find('option:selected')[0].value; 
    var d = ($country == 'IT') ? $country : ""; 
    $element.data('selectedcountry', d); 
    }); 

    $element.on('change', function() { 
    var ct = $(this).data('selectedcountry'); 
    //as you have it: $(this).after(ct);// append 
    // put it in the span to remove/blank out on subsequent changes 
    $('#afterit').text(ct); 
    }); 
}); 

这里是总less-verbose版本:

$('#woocommerce_cf_piva').on('change', function() { 
    var v = $('#billing_country').find('option:selected')[0].value; 
    $('#afterit').text((v == 'IT') ? v : ""); 
}); 
1

很难理解你想要用你的代码做什么。

只有在选择框中选择了“IT”时,您才希望文本输入更改其值?

为什么在文本输入中设置change处理程序?

为什么迭代通过选择框的选项,如果它是一个单一的选择?只需设置所选选项的值的文本输入,例如,

$(function() { 
    var $billingCountry = $('#billing_country'); 

    $billingCountry.change(function() { 
    var $country = $('#billing_country option:selected'); 
    fieldCheck($country.val()); 
    }); 

    function fieldCheck(country) { 
    var $element = $('#woocommerce_cf_piva'); 
    if ($country !== 'IT') { 
     return; 
    } 

    $element.val(country); 
    } 
}); 

https://jsfiddle.net/davelnewton/w5deffvk/

编辑

  • 命名规则改变,以反映典型的JS
    • 非构造函数名字以小写字母开头
    • 非JQ元素瓦尔不要用作防护条款领先$
  • 国家价值,而不是嵌套逻辑
    • 此代码是微不足道的,但嵌套可以使事情更难推理
+0

谢谢你回答,戴夫! 您提供的代码更具可读性。 我希望当我改变输入字段中的文本时,jQuery在输入字段中附加一个字(在本例中为IT) – ACA

0

你有两个问题:

  1. input标签没有onchange事件;你应该使用onkeydown来代替;
  2. 您应该在if条件之前分配事件。
-1

如果我正确地理解了这个问题,只想在下拉选择为“IT”时更新输入字段的值。如果是这种情况,则需要观察输入字段事件并在输入字段事件中使用来调用FieldCheck函数。