2011-04-20 91 views
0

我想根据2个先前字段的值来控制隐藏的输入值。我在switch语句方面取得了一些成功,但我似乎无法完全实现它。我想要做的是测试用户是否在#state字段中输入了CA或NV,如果他们这样做了,并且他们选择了选项值auto,则#ins_link值将分别变为CA或NV。我在这里做错了什么?以下是我与合作:jquery - 开关&&不工作?

<input class="statefield isstate" name="state" id="state" maxlength="2" onkeyup="this.value=this.value.toUpperCase();"> 

<select class="input_field_12em required" name="ins_type" id="ins_type"> 
              <option value="" selected="selected" >---Select Insurance Type---</option> 

        <option value="home">Home</option> 
        <option value="auto">Auto</option> 
        <option value="homeauto">Home + Auto</option> 
        <option value="renter">Renter</option> 
        <option value="buildingowner">Building Owner</option> 
        <option value="dwellingfire">Dwelling Fire</option> 
        <option value="commercial">Commercial</option> 
        <option value="agricultural">Agricultural</option> 
       </select>  


$(function() { 
    $('#ins_type').change(function() { 
     switch (this.value) { 
      case 'auto': 
      if ($("#state[CA]" && "#ins_type[auto]")) 
       $(".ins_link").val("CA"); 
       break; 
      case 'auto': 
      if ($("#state[NV]" && "#ins_type[auto]")) 
       $(".ins_link").val("NV"); 
      default : 
       $(".ins_link").val("summary"); 
      break; 
     } 
    }); 
}); 

<input type="hidden" class="link ins_link" value="summary"> 

回答

2

解决您的问题将是

$(function() { 
    $('#ins_type').change(function() { 
     if (this.value === "auto") { 
      var state = $("#state").val(); 

      if (state === "CA" || state === "NV") { 
       $(".ins_link").val(state); 
      } else { 
       $(".ins_link").val("summary"); 
      } 
     } 
    }); 
}); 

你看到这段代码实际上如何反映您的要求的实际方法是什么?

  • 如果#ins_type的值为 “auto”:
    • 如果#state的值是 “CA” 或 “NV” .ins_link的值设定为选择的状态。
    • 否则,将.ins_link的值设置为“摘要”。

你的代码结构应该反映你的思维结构。

+0

谢谢!这有助于我理解。不幸的是,现在当我选择除auto之外的其他选项时,.ins_link不会更改回“summary”,即使我确实看到您将其放入代码中。 ? – Paul 2011-04-20 21:40:00

+0

啊,好吧,按照逻辑链,在什么情况下,'.ins_link'的值被设置为'“summary”?只有当'#ins_type'的值是'auto'和'state'时而不是“CA”而不是“NV”。为了得到你想要的效果,当值为_not_'“auto”时,你将需要另外一个'else'来处理这种情况 – Domenic 2011-04-20 21:43:28

+0

谢谢Domenic! – Paul 2011-04-22 04:05:10

1
 if ($("#state[CA]" && "#ins_type[auto]")) 

这是做逻辑和两个字符串,其结果,然后用作在页面元素的选择。这不起作用。

示例代码并不显示何处/如何存储状态信息,但你想要更多的东西是这样的:

case 'auto': 
    if ($('#state').val() == 'CA') { 
     ... do california stuff ... 
    } 
    if ($('#state').val() == 'NV') { 
     ... do nevada stuff ... 
    } 
    break; 

内内如果再检查为“自动”选择( )是多余的,因为你已经强迫它与'switch()'自动'。

+0

他可能想要的是'$(“#state [CA],#ins_type [auto]”)length' – 2011-04-20 21:26:18

+0

@Kevin Peno:不会的,因为'#state'元素永远不会有一个名为'CA'的属性,所以属性选择器'[CA]'永远不会匹配。 – Domenic 2011-04-20 21:28:05

+0

@Domenic,*永远不会*或*不应该* *? – 2011-04-20 21:28:43

0

您对JavaScript和jQuery在这里的工作方式有一些误解。

"#state[CA]"只是一个字符串,如"#ins_type[auto]"

"#state[CA]" && "#ins_type[auto]"转换这些字符串的bool,然后询问他们是否都是真实的。只有空字符串转换为false,这样的逻辑是:

"#state[CA]" && "#ins_type[auto]" === true && true === true 

然后你包裹与一个$函数调用,刚刚其参数转换为一个jQuery对象。所以

$("#state[CA]" && "#ins_type[auto]") === $(true) = $() 

即你刚刚得到空的jQuery对象,因为你没有传递一个选择器或DOM元素。

如果测试任何非null,非undefined物体if,它将它转换为bool,所以你得到if(true)

if ($("#state[CA]" && "#ins_type[auto]")) 
<=> if ($()) 
<=> if (true) 

同样的逻辑也适用于你的第二个if声明,这样既if陈述什么都不做。

+0

很好的解释,但我没有投票! :( – 2011-04-20 21:26:51