0

背景 我有一个 PHP 从我的数据库生成的表单。该页面是晚宴活动的座位注册。每个 [晚餐] 餐桌都会收到一定数量的招待会门票。例如,一张 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数组的对象结构。我错过了什么?

4

2 回答 2

0

您的prefixCheck函数没有足够的信息来执行此操作。

至关重要的是,如果当前chair_limit计数大于零,那是因为当前的一位或多位客人有资格获得主席的接待。Thus when a prefix is selected, you should only increase the chair_limitif the prefix qualifies and if their previous prefix didn't qualify. 正如您非常正确地指出的那样,从 切换Sen.Sec.不应该改变任何一个计数。

然而,该prefixCheck功能目前没有足够的信息来进行这种区分。如果将新值旧值都作为参数传入,它将能够正确执行计算。

(并且不要忘记实现硬币的另一面 - 也就是说,如果有人从 eg 切换到,则减少 chair_limit和增加)gala_limitSec.Mr.

于 2012-07-20T14:54:08.337 回答
0

您没有做的是跟踪可能已选择的先前值。您的代码可以很容易地更改为这样做,但是:

  1. 更改'prefixCheck(this.value)'prefixCheck(this)传递对元素本身的引用。

  2. 稍微改变你的功能:


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-20T15:13:11.630 回答