Javascript HTML表单-值取决于两个不同的下拉菜单

Javascript HTML表单-值取决于两个不同的下拉菜单,javascript,forms,drop-down-menu,Javascript,Forms,Drop Down Menu,大家好,javascript专家 我是这里的新手,试图创建一个脚本来在网站上增加会员费(我是一名志愿者)。非常感谢您的帮助 我使用这个网站:设置我的html 它工作得很好(我设置了3个函数,一个用于计算会员价格,另一个用于计算邮资,另一个用于计算应付总额-我没有将它们包括在下面,但我知道它们工作得很好) 直到我意识到邮资的价值(我只使用第一个下拉菜单:id=country计算)也取决于第二个下拉菜单(第二个下拉菜单的id:membership\u type)中的金额。也就是说,邮资不仅取决于国家

大家好,javascript专家

我是这里的新手,试图创建一个脚本来在网站上增加会员费(我是一名志愿者)。非常感谢您的帮助

我使用这个网站:设置我的html

它工作得很好(我设置了3个函数,一个用于计算会员价格,另一个用于计算邮资,另一个用于计算应付总额-我没有将它们包括在下面,但我知道它们工作得很好)

直到我意识到邮资的价值(我只使用第一个下拉菜单:id=country计算)也取决于第二个下拉菜单(第二个下拉菜单的id:membership\u type)中的金额。也就是说,邮资不仅取决于国家,还取决于会员类型。我试图设置一个脚本,根据成员类型的值改变邮资的值,但它不起作用

正如你所说,我不是一个编码员,所以我花了很多时间寻找正确的方法来实现这一点,但已经走到了尽头


在下拉菜单中,我在每个下拉菜单的括号内都有这样的代码:

   select name="membership_type" id="membership_type" onchange="getAmountDue()"
   select name="country" id="country" onchange="getAmountDue()"     

你自诩为业余爱好者,你做得很好。我认为使用多维数组可能更容易解决您的问题,这样您就可以将会员价格与相应的邮资关联起来:

var MEMBERSHIP = 0;
var POSTAGE = 1;

var membership_prices = new Array();
membership_prices["regular"] = [40, 8];
membership_prices["student"] = [24, 8];
membership_prices["emeritus"] = [24, 8];
membership_prices["regularplus"] = [62, 16];
membership_prices["studentplus"] = [46, 16];
membership_prices["emeritusplus"] = [46, 16];
现在,要访问会员价格和邮费价格,如果选择了其他国家,您只需运行:

membership_prices["regular"][MEMBERSHIP]   // returns 40
membership_prices["regular"][POSTAGE]      // returns 8
我使用了成员资格和邮资,而不是0和1,因此当您获取成员资格和发布的值时,它可能会使代码更可读。或者,如果愿意,您可以使用0和1访问内部数组:

membership_prices["regular"][0]   // returns 40
membership_prices["regular"][1]      // returns 8

如果我理解了你想要做的事情,看起来你在正确的轨道上,但是需要颠倒你对变量逻辑的思考。您还有一些额外的
s和
{}
s

请尝试将此代码替换为下面的代码

试试这个:

var otherCountryPostageCost = 0,
    membershipType = document.getElementById('membership_type');

if (membershipType == "regular" || membershipType == "student" || membershipType == "emeritus"){
  otherCountryPostageCost = 8;
} else if (membershipType == "regularplus" || membershipType == "emeritusplus") {
  otherCountryPostageCost = 16;
}

extra_postage_cost["Other_Country"] = otherCountryPostageCost;
我也是一个新手:)有一段时间,我认为增加其他国家额外邮费的最具可读性的方式,假设会有很多,并得出以下结论:

额外邮资成本[“国家]=[(普通),(学生),(退休)]

括号中的每个值都是一个数字。例如:

额外邮资成本[“Ostia”]=[10,20,30,60,60,30];

为此,我们需要定义一些变量和函数。其思想是将
membership\u types
中类型(学生、普通)的数字顺序链接到每个额外邮资成本数组中的数字位置

  membership_types = ["regular", "student", "emeritus", 
    "regularplus", "studentplus", "emeritusplus"];

  function membership_index(m_type) {
    var index = -1;
    for(var i = 0; i < membership_types.length; i++) {
      if(m_type == membership_types[i]) {
        index = i;
      }
    }
    return index;
  }
结果如下:


p、 我认为从技术上讲,您不是在创建数组,而是在创建对象,因此我声明
variable_name={}
我假设国家下拉列表默认为USA。如果是这种情况,只需在调用函数以更新额外费用的下拉列表中添加一个“onchange”事件侦听器

因此,与其使用数组对象来增加额外的邮资,只需将变量extraPostage初始设置为零,并在下拉列表更改时更新它

    var extraPostage = 0;

    function onSelectChange(){
      var countrySelect = document.getElementById('countrySelect'); 
      var typeSelect = document.getElementById('membership_type');
      if(countrySelect.value != "Other Country"){
        extraPostage = 0;
        return;
      }
      else{
        var type = typeSelect.value;
        switch(type){
          case "regular":
            extraPostage = 8;
            break;
          case "student":
            extraPostage = 8;
            break;
          case "emeritus":
            extragPostage = 8;
            break;
          //keep going for each different possibility
        }

    }

不要忘记在每个
文档.getElementByID()
之后都有
.value
;否则,您将得到实际的DOM元素,而不是字符串值。此外,第一行缺少一个=(应该是
=
).啊,谢谢。在编辑逻辑时忽略了这一点。编辑了我的答案。我被每个人的慷慨所折服!我要先试试这个,因为它更适合我的代码。我还将编辑顶部的代码,这样你就可以看到它现在的样子了…目前我得到$NaN错误实际上,当我选择U时,我没有得到$NaNSA或CanadaSo除了“其他国家”部分外,其他一切都正常。当额外邮资为零时,会员费和额外邮资加在一起。但代码的“其他国家”部分仍然缺少一些内容(请参阅我更新代码的顶部)问题是,这没有考虑到可以选择“其他国家”以外的国家/地区…感谢您提供的详细代码。但我最终想要的是新会员的总成本。我想要会员类型成本和可能的额外邮费成本(取决于所选国家/地区)在底部加上一个总数。我想实际上这可能是一针见血。我想我要做的应该是通过计算邮费的函数来完成,而不是通过一个复杂的数组。不过我仍然有一些问题。最后,我不需要“返回额外邮费”的函数吗?(将此值发送到将邮资成本添加到会员成本的函数)如果是这样,在我上面看到的else语句的最后一个括号之后,我是否需要“;”或者我只是在最后一个函数结束括号之前键入return extraPostage?我尝试过这个方法,但似乎不起作用…我找到了!我必须添加到在每个金额后返回“extraPostage”(例如extraPostage=8;return extraPostage;)。我还将函数命名为“getExtraPostagePrice”,因此它与合计两个金额的函数一起工作。现在它工作了!谢谢!
var otherCountryPostageCost = 0,
    membershipType = document.getElementById('membership_type');

if (membershipType == "regular" || membershipType == "student" || membershipType == "emeritus"){
  otherCountryPostageCost = 8;
} else if (membershipType == "regularplus" || membershipType == "emeritusplus") {
  otherCountryPostageCost = 16;
}

extra_postage_cost["Other_Country"] = otherCountryPostageCost;
  membership_types = ["regular", "student", "emeritus", 
    "regularplus", "studentplus", "emeritusplus"];

  function membership_index(m_type) {
    var index = -1;
    for(var i = 0; i < membership_types.length; i++) {
      if(m_type == membership_types[i]) {
        index = i;
      }
    }
    return index;
  }
extraPostage = extra_postage_cost[whichCountry][membership_index(whichMembership)];
    var extraPostage = 0;

    function onSelectChange(){
      var countrySelect = document.getElementById('countrySelect'); 
      var typeSelect = document.getElementById('membership_type');
      if(countrySelect.value != "Other Country"){
        extraPostage = 0;
        return;
      }
      else{
        var type = typeSelect.value;
        switch(type){
          case "regular":
            extraPostage = 8;
            break;
          case "student":
            extraPostage = 8;
            break;
          case "emeritus":
            extragPostage = 8;
            break;
          //keep going for each different possibility
        }

    }