4

forループを使用して、開始値(平面上の座席)を持ついくつかの要素を循環しています。

ここにそれがあります:
seatNum-startSeatを循環する座席の数
-循環を開始する座席

「onsubmit」というフォームから関数を呼び出しています。

追加されたループカウンターに基づいて、「s1」、「s2」、「s3」などのID命名規則を持つ要素を取得しようとすると、forループで問題が発生します。スタートシート。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;
        }
    }
}
4

7 に答える 7

7

変数を数値にy変換します。z

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が指摘した問題が修正されます。

于 2009-12-09T05:54:35.853 に答える
5

よくわかりませんが、startSeat + iは文字列を連結していて、期待する数学的追加を行っていない可能性があります。画面に警告してみてください:

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

フィールド名ですか?

于 2009-12-09T05:50:14.503 に答える
2

これを試して:

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

シートIDを取得するために値を追加iするのではなく、ループの初期化で値を使用してください。何が起こっていたのかというと、値がすでに設定されているために1つずつエラーが発生し、それに追加して1つ先に進んでいたことだと思います。startSeatstartSeat'sstartSeati

于 2009-12-09T05:50:06.623 に答える
1

座席を循環すると言うとき、最大座席に達した後も1から数え続けたいと思いますか?numberOfSeatsがどこかで定義されていると仮定すると(私はそれを見ることができませんでしたが、どこかにある必要があります)、これを行うことができます:

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

したがって、行全体:

if (document.getElementById("s"+((startSeat + i - 1) % numberOfSeats + 1)).className=="taken"){
于 2009-12-09T05:55:09.717 に答える
1

実際に取得しているのは文字列の連結であるため、実際に発生しているのは次のとおりです。

i = 10
seatNum = 1

(seatNum+i) = "110"

parseInt()変数を整数型にキャストする関数を使用して、これを試してください。

if (document.getElementById("s"+(parseInt(startSeat)+parseInt(i))).className=="taken")
于 2009-12-09T05:55:20.143 に答える
1

Looks to me like startSeat is a string type. Even though JavaScript is type-less, the value of a DOM object is going to default as a string. So, you're getting a concatenation instead of addition.

Use what CMS wrote. That should fix your problem.

于 2009-12-09T05:58:22.977 に答える
0

1つを何度も繰り返している可能性があります。i < seatNum - 1forループで試してください

于 2009-12-09T05:50:31.600 に答える