Javascript getElementById表现奇怪

时间:2009-12-09 05:46:36

标签: javascript object loops plane

我正在使用for循环来循环一些具有起始值的元素(在平面上的座位)。

这是:
seatNum - 要通过循环的座位数 startSeat - 开始骑自行车的座位

我正在从“onsubmit”形式调用该函数。

问题出现在for循环中,当我尝试获取具有id命名约定“s1”“s2”“s3”等的元素时...“s45”“s46”等...基于循环柜台加入了起始座位。计数从0(起始座位)到seatNum(多少个座位)。

任何想法为什么id没有正确解决?所有其他工作正常,除了for循环中的最后一个。

是的我是编程的新手,所以我可能没有最好的做法,请在风格上原谅。

function check() {
    var startSeat;
    var fName = document.getElementById('fName').value
    var lName = document.getElementById('lName').value
    var address = document.getElementById('address').value
    var city = document.getElementById('city').value
    var state = document.getElementById('state').value
    var zip = document.getElementById('zip').value
    var phone = document.getElementById('phone').value
    var seatNum = document.getElementById('seatNumber').value
    var y=document.getElementById('seatList1').value;
    var z=document.getElementById('seatList2').value;

    if (z >= y) {
        startSeat = y;
    }
    else {
        startSeat = z;
    }

    if ( (fName == "") || (lName == "") || (address == "") || (phone == "") || (zip == "") || (state == "") || (city == "") ) {
        alert("You must fully complete the form");
        return false;
    }

    for (var i = 0; i < seatNum; i++) {
        if (document.getElementById("s"+(startSeat+i)).className=="taken"){
            alert("Selected seat(s) already booked.");
            return false;
        }
    else {
            continue;
        }
    }
}

7 个答案:

答案 0 :(得分:7)

将您的yz变量转换为数字:

var y = +document.getElementById('seatList1').value;
var z = +document.getElementById('seatList2').value;

var startSeat = (z >= y) ? y : z; // or simply startSeat = Math.min(z,y);

这将解决@Faruz指出的问题。

答案 1 :(得分:5)

我不确定,但也许startSeat + i会对字符串进行汇总,而不是按照您的预期进行数学加法。 尝试提醒屏幕:

alert(document.getElementById("s"+(startSeat+i))); 

是字段名吗?

答案 2 :(得分:2)

试试这个:

for (var i = startSeat; i < seatNum; i++) {
    if (document.getElementById("s"+i).className == "taken") {
        alert("Selected seat(s) already booked.");
        return false;
    }
}

不是将i添加到startSeat值以获取座位ID,而是在循环初始化中使用startSeat's值。我相信发生的事情是你获得off-by-one error,因为你的startSeat值已经设置,然后你向它添加了i,这让你前进了一个。

答案 3 :(得分:1)

当你说通过座位循环时,我假设你想要在达到最大座位后继续计数?假设numberOfSeats是在某个地方定义的(我看不到它,但你必须在某个地方找到它),你可以这样做:

"s"+((startSeat + i - 1) % numberOfSeats + 1)

所以完整的一行:

if (document.getElementById("s"+((startSeat + i - 1) % numberOfSeats + 1)).className=="taken"){

答案 4 :(得分:1)

你真正得到的是字符串连接,所以真正发生的是:

i = 10
seatNum = 1

(seatNum+i) = "110"

尝试使用parseInt()函数将变量转换为整数类型:

if (document.getElementById("s"+(parseInt(startSeat)+parseInt(i))).className=="taken")

答案 5 :(得分:1)

在我看来,startSeat是一种字符串类型。即使JavaScript是无类型的,DOM对象的值也将默认为字符串。所以,你得到的是串联而不是添加。

使用CMS编写的内容。这应该可以解决你的问题。

答案 6 :(得分:0)

你可能会迭代一次太多次。在for循环中尝试i < seatNum - 1