2010-08-30 3 views
0

J'ai reçu le "Nouveau formulaire utilisateur". Il existe trois niveaux de clearence:Javascript ne parvient pas à masquer des DIVs

  • client
  • clientContact
  • clientRepresentative

Et il y a des champs, comme newMail, newPostalCode, etc.

Voici un I code j'utilise pour afficher un élément:

function doShow(obj) { 
        document.getElementById(obj).style.display = ''; 
       } 

Et un code J'utilise pour cacher un élément:

function doHide(obj) { 
        document.getElementById(obj).style.display = 'none'; 
       } 

Il fonctionne pour les petits blocs de données. Lors de la création d'un utilisateur, le niveau de clairance est spécifié, s'il est clientRepresentative, le champ approprié est affiché. Dans l'exemple, le client a une seule adresse e-mail, clientRepresentative a deux adresses e-mail et clientContact en a trois.

Mais ce ne fonctionne pas!. Si je choisis le client, il y a un e-mail, comme prévu, mais si je choisis clientContact et que je passe à clientRepresentative, le champ redondant (e-mail3) est ne pas être caché. Je crois qu'il s'agit d'un problème JavaScript, aidez-moi, car mon niveau de colère atteint le plafond.

modifier: J'ai oublié de coller la fonction utilisée pour afficher/masquer les éléments.

if (clearenceLevel != "Chose...") { 
         if (clearenceLevel == "client") { 

          doShow("newMail"); 
          doHide("newMail2"); 
          doHide("newMail3"); 
          doShow("newNip"); 
          doShow("newRegon"); 
          doShow("newStreet"); 
          doHide("newHeadquarters"); 
          doShow("newAddress"); 
          doShow("newPostalCode"); 
          doShow("kptekst"); 
          doShow("newCity"); 
          doShow("newAccount"); 
          doShow("newState"); 
          doHide("newStatus"); 
          doHide("newPassword"); 
         } else if (clearenceLevel == "clientRepresentative") { 

          doShow("newMail"); 
          doShow("newMail2"); 
          doHide("newStatus"); 
          doHide("newMail3"); 
          doHide("newNip"); 
          doHide("newRegon"); 
          doHide("newStreet"); 
          doHide("newHeadquarters"); 
          doHide("newAddress"); 
          doHide("newPostalCode"); 
          doHide("newCity"); 
          doHide("newAccount"); 
          doHide("newState"); 
          doHide("kptekst"); 
          doShow("newPassword"); 

         } else if (clearenceLevel == "clientContact") { 

          doShow("newMail"); 
          doShow("newMail2"); 
          doShow("newMail3"); 
          doHide("newNip"); 
          doHide("newRegon"); 
          doHide("newStatus"); 
          doHide("newStreet"); 
          doHide("newHeadquarters"); 
          doHide("newAddress"); 
          doHide("newPostalCode"); 
          doHide("newCity"); 
          doHide("newAccount"); 
          doHide("newState"); 
          doHide("kptekst"); 
          doHide("newPassword"); 
         } 
        } 
+0

Qu'est-ce que vous passez pour doShow et DoHide? Il semble que ce devrait être une chaîne (l'identifiant de l'élément) mais l'argument est appelé "obj". Si vous avez passé un objet élément DOM, le code ne fonctionnerait pas. – Douglas

+0

Êtes-vous sûr à 100% que chaque ID existe dans le document une seule fois? –

+1

Vous avez vraiment besoin d'outils appropriés pour le débogage de ces choses, comme Firebug (sur Firefox) ou Fiddler (IE). – tdammers

Répondre

1

Pas une réponse directe à votre question, mais une suggestion sur la façon dont vous pourriez améliorer la façon dont vous faites cela. Au lieu d'avoir à la liste chaque propriété pour afficher et masquer pour chaque niveau d'utilisateur, faire quelque chose comme:

<input type="text" name="email" class="client representative contact"> 
<input type="text" name="ssn" class="representative"> 

Ensuite, lorsque les changements de niveau utilisateur cachent tout et unhide alors tout ce qui a le niveau correct. Donc dans mon exemple "email" est disponible pour "client" "représentant" et "contact". Donc, s'ils passaient à l'un de ces niveaux, ce champ s'afficherait, mais "ssn" n'est disponible que pour "representative", donc il ne s'afficherait pour personne d'autre.

L'avantage de ce serait la possibilité d'ajouter facilement un nouvel élément sans besoin de modifier le Javascript, seul le HTML.

if (clearenceLevel != "Chose...") { 
        hideAll(); 
        if (clearenceLevel == "client") { 
         doShow("client"); 
        } else if (clearenceLevel == "clientRepresentative") { 
         doShow("representative"); 
        } else if (clearenceLevel == "clientContact") { 
         doShow("contact"); 
        } 
} 
+0

Excellente idée, je vais adopter mon code de cette façon. Merci pour la suggestion. – TBH

1

Vous avez probablement fait une erreur dans le code. Sinon if (clearenceLevel == "clientRepresentative") {
doShow ("newMail");
doShow ("newMail2");
doHide ("newStatus");
doShow ("newMail3"); // ne devrait-il pas être doHide()?
// etc

De votre message, je compris que vous voulez cacher l'e-mail3 lors du passage à clientRepresentative, mais dans le code ci-dessus doShow() est exécutée au lieu de DoHide().

+0

Vous avez raison, ça devrait être doHide(), mais ça ne change rien, car quand clientRepresentative est choisi, le champ newMail3 est encore visible;/ La chose amusante est, si je choisis clientRepresentative, puis client, champ redondant est caché. – TBH

0

Merci pour vos réponses, je posterai le formulaire utilisé pour envoyer les données

echo '<div id="newMail"><br><font color="red">*</font>email: <input type="text" name="newMail" value="' . $_POST['newMail'] . '" /> </div>'; 
    echo '<div id="newMail2"><br>email 2: <input type="text" name="newMail2" value="' . $_POST['newMail2'] . '" /> </div>'; 
    echo '<div id="newMail3"><br>email 3: <input type="text" name="newMail3" value="' . $_POST['newMail3'] . '" /> </div>'; 
    echo '<div id="newNip"><br>nip: <input type="text" maxlength="15" name="newNip" value="' . $_GET['nip'] . '"/> </div>'; 
    echo '<div id="newRegon"><br>regon: <input type="text" name="newRegon" value="' . $_POST['newRegon'] . '" /> </div>'; 
    echo '<div id="newStreet"><br>Street: <input type="text" name="newStreet" value="' . $_POST['newStreet'] . '" /> </div>'; 
    echo '<div id="newHeadquarters"><br>Headquarters: <select name="newHeadquarters"> '; 
+1

Vous ne fermez pas votre dernière div dans ce code. Est-ce une faute de frappe ou un oubli? – Tommy

+0

C'est juste un oubli, je cachais le champ qui n'existe pas. Et le code Javascript plantait. Merci pour votre effort. – TBH

Questions connexes