我在做表单验证,如果下拉菜单选中的是“请选择”,那就显示出后面的提示文字。html 如下:
<select class="span3" id="phase"> <option>请选择</option> <option>小学</option> <option>初中</option> <option>高中</option> <option>幼儿园</option> </select> <span class="help-inline c-81f" style="display:none;">请选择学段</span> <a class="ks-button ks-button-primary" href="javascript:;" id="submit">提交</a>
js 是这样写的:
var oBtnSub=document.getElementById('submit'); var oSelPh=document.getElementById('phase'); var sTxtP=oSelPh.options[oSelPh.selectedIndex].text; var oSpanP=oSelPh.nextElementSibling || oSelPh.nextSibling; oBtnSub.onclick=function(){ if(sTxtP!='请选择'){ return; } else{ oSpanP.style.display='inline-block'; } };
现在的结果是无论我选择哪个选项,都会出现文字提示。求高手解答,问题出在哪儿了?
楼上已经给出了正确的答案,既然你仍然不太明白,那么我来给你分解一下你的代码,如下:
var oBtnSub=document.getElementById('submit'); var oSelPh=document.getElementById('phase'); //或者选择框的值,现在的值是"请选择",oSelph.selectedIndex默认是0 var sTxtP=oSelPh.options[oSelPh.selectedIndex].text; var oSpanP=oSelPh.nextElementSibling || oSelPh.nextSibling; oBtnSub.onclick=function(){ //当click的时候,sTxtp的值是空字符串 if(sTxtP!='请选择'){ return; }else{//所以走了else oSpanP.style.display='inline-block'; } };
你在onclick之前就已经获取了字符串,效果就类似于这样:
var sTxtP="请选择";
所以你在onclick的时候判定是错误的。
本质上你的错误发生在:
你提前获取了sTxtP的值。当用户选择下拉框里面的项,你的sTxtP的值也并没有改变,因为你在用户选择下拉框之前就已经确定了它的值。
所以我们要改成动态获取的,我们修正代码,并假设,在点击"提交"按钮之前,用户在下拉框选项中选择了"小学":
var oBtnSub=document.getElementById('submit'); var oSelPh=document.getElementById('phase'); var oSpanP=oSelPh.nextElementSibling || oSelPh.nextSibling; oBtnSub.onclick=function(){ //在onclick中获取 => 如果用户选择了小学,那么这里会拿到用户选择的"小学" var sTxtP=oSelPh.options[oSelPh.selectedIndex].text; if(sTxtP!='请选择'){ return; }else{ oSpanP.style.display='inline-block'; } };
你需要理解的是代码的执行时机。
回答得非常详细!我终于明白了 :) 谢谢~
oSpanP.style.display=sTxtP!='请选择'?'none':'inline-block';
var oSelPh=document.getElementById('phase');
var sTxtP=oSelPh.options[oSelPh.selectedIndex].text;
这个代码,要放到onclick中去。
正解!但是这两行代码为什么必须放在 onclick 里面呢?这个表单里我还有一个对文本框的验证,而文本框的声明没有放在 onclick 里,是没问题的,这是为什么呢?