2009-12-09 4 views
4

Я использую цикл for для циклического перехода через некоторые элементы со стартовым значением (места на плоскости).Javascript getElementById действует нечетно

Здесь:
seatNum - Количество мест, подлежащих циклическое через
startSeat - сиденье, чтобы начать езду на велосипеде

Я вызываю функцию из формы «onsubmit».

Проблема возникает в цикле for, когда я пытаюсь получить элементы с соглашением о присвоении имен «s1» «s2» «s3» и т. Д. «S45» «s46» и т. Д. ... на основе счетчик циклов, добавленный к стартовому месту. Подсчет от 0 (начальное место) до местаNum (сколько мест).

любая идея, почему по 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; 
     } 
    } 
} 
+0

Как вы устанавливаете s-like ID? Приходят ли они с разметкой страницы или вы создаете их с помощью javascript после загрузки страницы? – yoda

+0

в разметке. это на самом деле таблица здесь -> http://www.pixology.net/planesite/ – user48202

ответ

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 указал.

+0

Спасибо. Я могу сказать, что этот сайт будет проблемой для меня. :) – user48202

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, чтобы получить идентификатор места, используйте startSeat's значение прямо в инициализации цикла. Я считаю, что произошло то, что вы получали off-by-one error, так как ваше значение startSeat было уже установлено, а затем вы добавляли i к нему, который натолкнул вас вперед на один.

+0

проблема заключается в том, что startSeat может быть числом в диапазоне от 1 до 10, а seatNum всегда будет одной цифрой, меньшим числом. поэтому условие (i user48202

5

Я не уверен, но, возможно, startSeat + i конкатцирует строки и не выполняет математическое ожидание. Попробуйте оповещения на экране:

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

Является ли это имя поля?

0

Возможно, вы повторяете слишком много раз. Попробуйте i < seatNum - 1 в вашем цикл

1

Когда вы говорите, проезжая через сиденья, я предполагаю, что вы хотите продолжать отсчет с 1 после достижения максимального места?Предполагая, что numberOfSeats определяется где-то (я не мог видеть его, но вы должны иметь его где-то), вы можете сделать это:

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

поэтому линия в полном объеме:

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

Что вы действительно получают конкатенации, так что на самом деле происходят так:

i = 10 
seatNum = 1 

(seatNum+i) = "110" 

Попробуйте это с помощью функции parseInt() для литья переменных целочисленных типов:

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

Похоже, что startSeat - это строковый тип. Несмотря на то, что JavaScript не имеет значения типа, значение объекта DOM будет использоваться как строка. Итак, вы получаете конкатенацию вместо добавления.

Используйте то, что написал CMS. Это должно решить вашу проблему.

Смежные вопросы