后台我有一个从我的数据库生成的表单。这一页是晚餐活动的座位登记。每张餐桌都收到一定数量的入场券。例如,一张由10个座位组成的桌子可能有7张晚会招待会的门票和3张主席招待会的票。
每一行都有一个前缀值,该值将前缀存储在数组中,然后循环通过该数组获取值。看上去像是:
<select name='prefix[]' onchange='prefixCheck(this.value)' >
<option value=''>Select</option>
<option value='Mr.'selected >Mr.</option>
<option value='Ms.' >Ms.</option>
<option value='Dr.' >Dr.</option>
<option value='Sen.' >Sen.</option>
<option value='Sec.' >Sec.</option>
<option value='Rep.' >Rep.</option>
</select>我的表单上将有不同数量的这些prefix[]字段。我的页面顶部还有一个柜台,上面显示了一张桌子上目前有多少张宴会和主席接待费:
<td align = left>
Total Gala Reception Tickets Available:
</td>
<td align = center>
<input type='text' size='2' id='gala' name='gala' value=7 style='background-color:#C8C8C8 '>
<input type='hidden' size='2' id='gala_orig' name='gala' value=7 >
</td>
</tr>
<tr>
<td align = left>
Total Chairman's Reception Tickets Available
</td>
<td align = center>
<input type='text' id='chairman' name='chairman' size='2' value=3 style='background-color:#C8C8C8 '>
<input type='hidden' id='chairman_orig' name='chairman' size='2' value=3 >
</td>
</tr> Sen.、Sec.、Rep.的前缀值是特殊的,这意味着如果用户为每个座位选择其中一个,我希望gala的计数减少,chairman的数目增加。我有这个javascript函数,但我似乎是一个关键的部分。如果用户选择Sen.,则会发生该操作,但如果他们选择另一个限定前缀,则该操作将再次发生;
function prefixCheck(v){
gala_limit = document.getElementById('gala').value;
chair_limit = document.getElementById('chairman').value;
if(v == 'Sec.' || v == 'Sen.' || v == 'Rep.'){
gala_limit--;
chair_limit++;
document.getElementById('gala').value = gala_limit;
document.getElementById('chairman').value = chair_limit;
}
else{
document.getElementById('gala').value = document.getElementById('gala_orig').value;
document.getElementById('chairman').value = document.getElementById('chair_orig').value
}
}我不希望更改prefix数组的对象结构。我遗漏了什么?
发布于 2012-07-20 15:13:11
您所不做的是跟踪可能已选中的先前值。但是,您的代码可以很容易地进行更改:
'prefixCheck(this.value)更改为'prefixCheck(this),以传递对元素本身的引用。function prefixCheck(v)
{//v is now a reference to the changed elem:
var wasSpecial = elem.oldValue || '';//if nothing was selected, it wasn't a special guest before
//don't use globals, use var inside functions
var gala_limit = document.getElementById('gala').value;
var chair_limit = document.getElementById('chairman').value;
if(v.value == 'Sec.' || v.value == 'Sen.' || v.value == 'Rep.')
{
if (wasSpecial === '')
{
gala_limit--;
chair_limit++;
if (gala_limit < 0)
{
alert ('No room for you '+ v.value);
}
}
document.getElementById('gala').value = gala_limit;
document.getElementById('chairman').value = chair_limit;
v.oldValue = 'yes';//set some oldValue property, to mark that this element has been set to a special guest value
}
else
{
if (wasSpecial !== '')
{
document.getElementById('gala').value = ++gala_limit;
document.getElementById('chairman').value = --chair_limit;
}
if (chair_limit < 0)
{
alert('erm... no more chairs?');
}
v.oldValue = '';//always set your oldValue to mark a non special value was selected
//I see no real reason why you should reset your counters here, but you can
//Though I'd suggest just setting the #gala and #chairman elements when the page loads and keep using the values herein.
//document.getElementById('gala').value = document.getElementById('gala_orig').value;
//document.getElementById('chairman').value = document.getElementById('chair_orig').value
}
}您还可以将事件本身传递给函数:prefixCheck(this,event),而不是报警,捕获它(e.preventDefault()或e.returnValue = false)。
另一件事:代替if ((v.value === 'Sen.'....,正则表达式,v.value.match(/^[SR]e[cnp]\.$/,甚至更好:if (v.value.charAt(1) === 'e'将同样工作,并且更易读.
虽然我不确定这能回答你的问题,但我希望它至少有一些用处。
发布于 2012-07-20 14:54:08
您的prefixCheck函数没有足够的信息来执行此操作。
关键的是,如果目前的chair_limit计数超过零,那是因为一位或多位现任客人有资格得到主席的接待。因此,当选择前缀时,只有在前缀限定为chair_limit的情况下,才应该增加前缀,如果前缀的前一个前缀没有限定,则增加。正如您非常正确地指出的,从Sen.切换到Sec.不应该改变任何一个计数。
然而,prefixCheck函数目前没有足够的信息来进行这种区分。如果将新值和旧值作为参数传入,则它将能够正确地执行计算。
(别忘了实现硬币的另一面--也就是说,如果有人从chair_limit切换到Mr.,就会减少Sec.和增加Sec.)。
https://stackoverflow.com/questions/11581608
复制相似问题