2009-12-09 8 views
4

J'utilise une boucle for pour faire défiler certains éléments avec une valeur de départ (sièges sur un plan).Javascript getElementById agissant impair

Ici, il est:
seatNum - Nombre de sièges à travers
pédalé startSeat - siège pour commencer le cyclisme

J'appelle la fonction d'une forme « onsubmit ». Le problème vient dans la boucle for quand j'essaie d'aller chercher des éléments avec une convention de nommage d'id de "s1" "s2" "s3" etc ... "s45" "s46" etc ... basé sur le compteur de boucle ajouté au siège de départ. Compter de 0 (siège de départ) jusqu'au nombre de sièges (nombre de sièges).

une idée pourquoi ID ne se corrige pas correctement? Tous les autres fonctionnent bien sauf le dernier à l'intérieur de la boucle for.

Oui, je suis nouveau à la programmation donc je n'ai probablement pas les meilleures pratiques, s'il vous plaît pardonner stylistiquement.

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

Comment définissez-vous des ID de type s? Viennent-ils avec le balisage de page ou les créez-vous avec javascript après le chargement de la page? – yoda

+0

dans le balisage. c'est en fait un tableau ici -> http://www.pixology.net/planesite/ – user48202

Répondre

7

Convertissez vos y et z des variables au numéro:

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); 

qui résoudra le problème @Faruz souligné.

+0

Merci. Je peux dire que ce site va être un problème pour moi. :) – user48202

2

Essayez ceci:

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

Plutôt que d'ajouter à la valeur istartSeat pour obtenir l'ID de siège, utilisez la valeur startSeat's droite lors de l'initialisation de la boucle. Je crois que ce qui se passait, c'est que vous obteniez un off-by-one error puisque votre valeur startSeat était déjà définie et que vous y ajoutiez i qui vous a fait grimper d'un.

+0

le problème est que startSeat peut être des nombres allant de 1-104, et seatNum sera toujours un chiffre plus petit, plus petit. donc la condition (i user48202

5

Je ne suis pas sûr, mais peut-être startSeat + je concat les chaînes et ne pas faire l'ajout mathématique que vous attendez. Essayez d'alerte à l'écran:

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

Est-ce le nom du champ?

0

Vous pourriez répéter l'opération une fois de trop. Essayez i < seatNum - 1 dans votre boucle

1

Lorsque vous dites cycle à travers les sièges, je suppose que vous voulez continuer à compter à partir de 1 après avoir atteint le siège maximum?En supposant que numberOfSeats est défini quelque part (je ne pouvais pas le voir, mais vous devez avoir quelque part), vous pouvez le faire:

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

si la ligne complète:

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

Qu'est-ce que vous êtes vraiment obtenir est la concaténation de chaîne, donc ce qui se passe réellement est ceci:

i = 10 
seatNum = 1 

(seatNum+i) = "110" 

Essayez grâce à la fonction parseInt() pour la coulée des variables en types entiers:

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

Cela me semble que startSeat est un type de chaîne. Même si JavaScript est sans type, la valeur d'un objet DOM va être définie par défaut en tant que chaîne. Donc, vous obtenez une concaténation au lieu de l'addition.

Utilisez ce que le CMS a écrit. Cela devrait résoudre votre problème.