2010-02-12 4 views
1

Это для курса Java сценария, Im принимая ...Javascript: Получить значение индекса из массива

Мне нужно создать простой пользовательский сценарий входа в систему. Когда страница загружает приглашение, запрашивает имя пользователя. Если введено правильное имя пользователя, отображается другое приглашение с запросом пароля.

Если и имя пользователя, и действительное, то у вас есть успешное сообщение, в противном случае вы получите сообщение об ошибке.

Я написал весь код, но у меня проблемы с проверкой имени пользователя и пароля. В моем коде вы можете увидеть, что я использую два списка массивов. Один для пользователей и другой для паролей. Когда я запускаю свой код, если я ввожу правильное имя пользователя и пароль для user1, он проверяет, НО, если я введу user1 и пароль для user2, он все еще проверяет.

<script type="text/javascript"> 
//Input from user 
    var userId = prompt("Enter UserID", ""); 
     userId_lowercase = userId.toLowerCase(); 


//Username and Password Arrays 
    var userIdList = new Array(); 
     userIdList[0] = "user1"; 
     userIdList[1] = "user2"; 
     userIdList[2] = "user3"; 

    var passwordList = new Array(); 
     passwordList[0] = "pass1"; 
     passwordList[1] = "pass2"; 
     passwordList[2] = "pass3"; 

//Process input and check for authentication 

    //Check for correct userId 

     var userIdFound; 

     for (index in userIdList) 
     { 
      if (userId_lowercase == userIdList[index]) 
      { 
       userIdFound = "Y"; 
       break; 
      } 
     } 

     if (userIdFound == "Y") 
     { 
      document.write("<p>" + userId + " was Found</p>"); ; 
      //Check for correct Password 
      var password = prompt("Enter Password", ""); 
      var passwordFound; 

      for (index in passwordList) 
      { 
       if (password == passwordList[index]) // This is where I need help, 
                // how do I say 
                // "if password is from the passwordList && it matches the userId index selected" 

       { 
        passwordFound = "Y"; 
        break; 
       } 
      } 

      if (passwordFound == "Y") 
      { 
       document.write("<p>Welcome to the class!</p>"); 
      } 
      else 
      { 
       document.write("<p>Error: Password is not valid.</p>"); 
      }//END Password Check 

     } 
     else 

     { 
      document.write("<p>" + userId + " was NOT found</p>"); 
     }//END USERID Check 

</script> 
+1

Вход формы питание от Javascript можно легко подделать. Жаль, что в «домашнем задании» вы занимаетесь чем-то таким непрактичным. –

+0

@NSfY: Кстати, спасибо, что сообщили нам, что это проблема домашней работы. Практически никто этого не делает. – outis

ответ

2

Прежде всего, я бы не использовал for-in, я бы использовал простой цикл для итерации по массиву. Тогда вы могли бы хранить индекс, который совпадает с именем пользователя, чтобы сравнить его с матрицей пароль:

var index; 
var userIndex; 
for (index = 0; index < userIdList.length; index++) { 
      if (userId_lowercase == userIdList[index]) 
      { 
       userIndex = index; 
       userIdFound = "Y"; 
       break; 
      } 
} 

Затем в цикле пароля, вы бы сказали:

if (password == passwordList[index] && index == userIndex) 
{ 
    passwordFound = "Y"; 
    break; 
} 

Это простой путь вокруг проблема.Я не знаю, сколько вы узнали, но вы также можете использовать массив объектов:

var userLogins = [{user:"user1", password:"pass1"},...etc]; 

И затем петлю через этот массив сразу после того, как запрашивающее имя и пароль, и, видя, если они совпадают:

for (index = 0; index < userLogins.length; index++) { 
    if (userLogins.user == userId_lowercase && userLogins.password == password) { 
     //Do stuff here 
    } 
} 

Следует иметь в виду, что вам нужно как-то связать имя пользователя с паролем. То, как вы сейчас это делаете, - это индекс в обоих массивах, но это не гарантируется. Было бы гораздо лучше связать эти два бита информации каким-то образом, как в массиве объектов выше.

+0

Я очень благодарен за то, что вы передали свои знания. Это помогло кучу. У меня всегда была проблема с циклами. Работа над этими проектами действительно помогает мне понять их. Я согласен с тем, что многие люди упоминали об использовании Javascript для аутентификации пользователя. Но этот проект помог мне понять, как работать с массивами и циклами. Снова, вы, ребята, рок! BTW - сообщество StackoverFlow является ЛУЧШИМ! – NoDinero

2

Вместо того чтобы использовать массивы, использовать объекты как ассоциативные массивы:

var Users = { 
    root: 'god', 
    fred: 'derf', 
    luser: 'password' 
}; 

// you can access object properties using dot syntax: 
User.root 
// or using array syntax with a string as index 
User['root']; 
// when the name is stored in a variable, array syntax is the only option 
var name='root'; 
User[name]; 

Это хорошая вещь, это домашнее задание, в противном случае я бы надавать вам совет cluefulness из-за присущего незащищенность.

Вы также должны изучить использование DOM API, а не устаревшее document.write.

<script type="text/javascript"> 
    ... 
    function reportLogin(msg) { 
    var loginMsg = document.getElementById('LoginMsg'); 
    if (loginMsg.firstChild) { 
     loginMsg.firstChild.nodeValue=msg; 
    } else { 
     loginMsg.appendChild(document.createTextNode(msg)) 
    } 
    } 
</script> 
... 
<p id="LoginMsg"></p> 

или

<script type="text/javascript"> 
    ... 
    function reportLogin(msg) { 
    document.getElementById('LoginMsg').firstChild.nodeValue=msg; 
    } 
</script> 
... 
<p id="LoginMsg"> </p> 

(Обратите внимание на пробел в #LoginMsg.)

0

Вам нужно будет проверить индекс пользователя с паролем. После того как у вас есть имя пользователя, сохраните этот индекс для переменной, скажите indexOfUserName и проверьте этот индекс на свой массив паролей. Поэтому вместо того, если (пароль == passwordList [индекс]) проверьте (пароль == passwordList [indexOfUserName])

1

Вот где я хотел бы использовать хэш-таблицу (ассоциативный массив)

var users = { 
user1:"pass1", 
user2:"pass2", 
user3:"pass3" 
}; 

Теперь вам может протестировать следующим образом:

function checkValidUser(userId, userPwd) { 
    return (users[userId] == userPwd); 
} 

Очень простой.

+0

Не отдавайте слишком много, учитывая, что это домашнее задание. – outis

+1

Идея в порядке, но если пользователь вводит неверное имя и отменяет диалог с паролем, вы получите «undefined == null», который является истинным. Есть несколько простых исправлений, но использование javascript для этого в действительности не является действительно безопасным. –

+0

Да, Мэтт, вы можете использовать оператор === для решения этой проблемы. Crockett рекомендует всегда использовать это в любом случае. Я также начал читать лекцию о небезопасности использования Javascript для пароля для проверки, но это домашнее задание, в конце концов, поэтому я предположил, что это не будет реальный сценарий. – Robusto

0

Если вы хотите, чтобы ваш учитель сожалеет о ее вопрос, вот специальная версия:

var users = { user1:true, user2:true, user3:true }, 
     pwds = {user1:'pw1', user2:'pw2', user3:'pw3'}; 

    function theUser(userId){ 
     return { 
      hasThePassword:function(pwd){ 
       return users[userId] && pwds[userId] === pwd; 
      } 
     }; 
    } 
    if(theUser(prompt('Enter UserID', '')).hasThePassword(prompt('Enter Password', ''))){ 
     alert('user ok'); 
    }else{ 
     alert('wrong user or password'); 
    }; 

;-)

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