2016-01-22 122 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函數。