检测是否已通过Javascript功能更改下拉列表

时间:2015-07-22 14:51:08

标签: javascript jquery

我有一个Javascript函数,可以根据可用的地址列表自动填充表单字段。如果用户选择的选项是美国以外的国家/地区,我们将不会要求填写的表单中的邮政编码/州字段(所有"必需"验证通过"数据需要=真&#34)。表单是动态生成的,因此我不能使用某些人建议的.change()方法。

我有一个"变化"监听器设置删除"数据所需"属性,如果单击“国家/地区”下拉列表并选择其他国家/地区,则可以使用但是,当Javascript函数更改相同的下拉列表时,它不起作用。

jQuery( document ).ready(function() {

    jQuery('body').on('change','#coHCOUN',function() {
        if(jQuery(this).val() == 'US') {
            jQuery('#coHPOST').attr('data-required','true');
            jQuery('#coHSTE').attr('data-required','true');
        } else {
            jQuery('#coHPOST').removeAttr('data-required');
            jQuery('#coHSTE').removeAttr('data-required');
        }
    });
});

在选择地址时抓取隐藏的表单值并将其应用于表单的函数。这是用vanilla javascript编写的旧代码,而不是jQuery:

function SetShipTo(CIPID) {
    document.getElementById("coHNAME").value=document.getElementById("vSHIPTO" + CIPID + "HNAME").value;
    document.getElementById("coHATN").value=document.getElementById("vSHIPTO" + CIPID + "HATN").value;
    document.getElementById("coHAD1").value=document.getElementById("vSHIPTO" + CIPID + "HAD1").value;
    document.getElementById("coHAD2").value=document.getElementById("vSHIPTO" + CIPID + "HAD2").value;
    document.getElementById("coHAD3").value=document.getElementById("vSHIPTO" + CIPID + "HAD3").value;
    document.getElementById("coHSTE").value=document.getElementById("vSHIPTO" + CIPID + "HSTE").value;
    document.getElementById("coHPOST").value=document.getElementById("vSHIPTO" + CIPID + "HPOST").value;
    document.getElementById("coHCOUN").value=document.getElementById("vSHIPTO" + CIPID + "HCOUN").value;
    document.getElementById("coHVIA").value=document.getElementById("vSHIPTO" + CIPID + "HVIA").value;
    document.getElementById("coHSHPR").value=document.getElementById("vSHIPTO" + CIPID + "HSHPR").value;
    document.getElementById("coCIPLOC").value=document.getElementById("vSHIPTO" + CIPID + "CIPLOC").value;
    document.getElementById("SAVESHIPTOFU").checked=false;
}

我可以添加另一个事件监听器来检测某个值是否从javascript函数更改?如果可能的话,我不想在自动填充功能中添加额外的代码

3 个答案:

答案 0 :(得分:4)

触发更改内部功能的下拉列表更改,可以在这里帮助您

$('#coHCOUN').trigger('change')

答案 1 :(得分:1)

如果设置下拉列表的javascript(我假设它是选择标记)正在使用jQuery,您可以使用挂钩强制更改事件在$(' #select&#)时触发39;)。val('选项')被调用。这样您就不需要修改正在更改下拉列表的代码,该代码可能位于库中。

这样的事情:

$.valHooks.select = {
  get: function(elem) {
    return $(elem).val();
  },
  set: function(elem, value) {
    $(elem).val(value).trigger('change');
  }
};

在事件触发时可能没有注册值更改,因此触发器可能需要进入setTimeout。您可以省略get函数,我不确定。

答案 2 :(得分:0)

我认为您必须将更改侦听器指向下拉元素:

    $(#coHCOUN).change(function(){
        if(jQuery(this).val() == 'US') {
            jQuery('#coHPOST').attr('data-required','true');
            jQuery('#coHSTE').attr('data-required','true');
        } else {
            jQuery('#coHPOST').removeAttr('data-required');
            jQuery('#coHSTE').removeAttr('data-required');
        }

});    

此链接可能有用http://www.w3schools.com/jquery/event_change.asp