Форма входа в Javascript не отправляется, когда пользователь нажимает Enter

Я работаю над простым входом в javascript для сайта и придумал это:

<form id="loginwindow">
<strong>Login to view!</strong>
<p><strong>User ID:</strong>
  <input type="text" name="text2">
</p>
<p><strong>Password:</strong>
<input type="password" name="text1"><br>
  <input type="button" value="Check In" name="Submit" onclick=javascript:validate(text2.value,"username",text1.value,"password") />
</p>

</form>
<script language = "javascript">

function validate(text1,text2,text3,text4)
{
 if (text1==text2 && text3==text4)
 load('album.html');
 else 
 {
  load('failure.html');
 }
}
function load(url)
{
 location.href=url;
}
</script>

... который работает, за исключением одного: нажатие ввода для отправки формы ничего не делает. У меня такое чувство, что это потому, что я использовал «onclick», но я не уверен, что использовать вместо этого. Мысли?


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


person user27171    schedule 27.10.2008    source источник


Ответы (7)


Здесь обсуждается сразу несколько тем. Попробуем уточнить.

<сильный>1. Ваша непосредственная забота:

(Почему кнопка ввода не работает при нажатии ENTER?)

Используйте тип кнопки отправить.

<input type="submit".../> 

..вместо

<input type="button".../>

Ваша проблема на самом деле не имеет ничего общего с использованием атрибута onclick. Вместо этого вы не получаете желаемого поведения, потому что вы использовали тип ввода button, который просто не ведет себя так же, как кнопки отправки.

В HTML и XHTML есть поведение по умолчанию для определенных элементов. Кнопки ввода в формах часто имеют тип «отправить». В большинстве браузеров кнопки «отправить» срабатывают по умолчанию при нажатии клавиши ENTER из выделенного элемента в том же элементе формы. Тип ввода «кнопка» не работает. Если вы хотите воспользоваться этим поведением по умолчанию, вы можете изменить тип ввода на «отправить».

Например:

<form action="/post.php" method="post">
    <!-- 
    ...
    -->
    <input type="submit" value="go"/>
</form>

<сильный>2. Вопросы безопасности:

@Ady упомянул о проблеме безопасности. Существует целый ряд проблем с безопасностью, связанных с выполнением входа в систему с помощью javascript. Это, вероятно, выходит за рамки области этого вопроса, тем более что вы указали, что вас это не особенно беспокоит, и тот факт, что ваш метод входа на самом деле просто устанавливал для location.href значение новая html-страница (указывающая на то, что у вас, вероятно, нет реального механизма безопасности).

Вместо того, чтобы копаться в этом, вот ссылки на связанные темы на SO, если кто-то заинтересован в этих вопросах напрямую.

<сильный>3. Другие проблемы:

Вот быстрая очистка вашего кода, которая соответствует некоторым рекомендациям. Это не решает проблему безопасности, о которой упоминали люди. Вместо этого я включаю его просто для того, чтобы проиллюстрировать некоторые полезные привычки. Если у вас есть конкретные вопросы о том, почему я написал что-то определенным образом, не стесняйтесь спрашивать. Кроме того, просмотрите в стеке похожие темы (поскольку ваш вопрос, возможно, уже обсуждался здесь).

Главное, на что следует обратить внимание, — это удаление атрибутов события (onclick="", onsubmit="" или onkeypress="") из HTML. Они принадлежат javascript, и считается лучшей практикой не допускать javascript-событий в разметку.

<form action="#" method="post" id="loginwindow">
    <h3>Login to view!</h3>
    <label>User ID: <input type="text" id="userid"></label>
    <label>Password: <input type="password" id="pass"></label>
    <input type="submit" value="Check In" />
</form>

<script type="text/javascript">
window.onload = function () {
    var loginForm = document.getElementById('loginwindow');
    if ( loginwindow ) {
        loginwindow.onsubmit = function () {

            var userid = document.getElementById('userid');
            var pass = document.getElementById('pass');

            // Make sure javascript found the nodes:
            if (!userid || !pass ) {
                return false;
            }

            // Actually check values, however you'd like this to be done:
            if (pass.value !== "secret")  {
                location.href = 'failure.html';
            }

            location.href = 'album.html';
            return false;
        };
    }
};
</script>
person Community    schedule 27.10.2008
comment
это выглядит чертовски хорошо. пара быстрых вопросов: 1. где в этом коде я могу установить имя пользователя и пароль? 2. Помогло бы с безопасностью, если бы я поместил javascript во внешний файл и дал ссылку на него? большое спасибо за ваш обстоятельный ответ! - person user27171; 27.10.2008
comment
3. (ха-ха, извините за назойливость. Я очень ценю вашу помощь!) Кажется, что используя ваш код, не имеет значения, что я ввожу в качестве имени пользователя и пароля, он просто перенаправляет на альбом.html. как я могу это исправить? - person user27171; 27.10.2008
comment
Re: 1 и 3, я изменил приведенный выше пример кода, чтобы сделать его более очевидным. Посмотрите, поможет ли это. - person keparo; 27.10.2008
comment
Re: 2 Помещение js во внешний файл не поможет. Безопасный способ — позволить форме отправлять значения на сервер через https и контролировать вход на сервер. Это немного сложно объяснить полностью в стороне от этого вопроса, но я могу порекомендовать некоторые ресурсы или открыть новый вопрос. - person keparo; 27.10.2008

Вместо ‹input type="button"› используйте ‹input type="submit"›. Вы можете поместить свой код проверки в обработчик отправки формы:

‹form id="loginwindow" onsubmit="validate(...)"›

person Josh Hinman    schedule 27.10.2008

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

<input type="password" name="text1" onkeypress="detectKey(event)">
person Derek H    schedule 27.10.2008
comment
Могу ли я добавить href для перехода к определенной странице ввода? - person ; 18.07.2014

Поместите скрипт прямо в ваш html-документ. Измените значение onclick на функцию, которую вы хотите использовать. Сценарий в html сообщит форме для отправки, когда пользователь нажмет кнопку ввода или кнопку отправки.

 <form id="Form-v2" action="#">

<input type="text" name="search_field"  placeholder="Enter a movie" value="" 
id="search_field" title="Enter a movie here" class="blink search-field"  />
<input type="submit" onclick="" value="GO!" class="search-button" />        
 </form>

    <script>
    //submit the form
    $( "#Form-v2" ).submit(function( event ) {
      event.preventDefault();
    });
         </script>
person csandreas1    schedule 15.05.2017

Может быть, вы можете попробовать это:

<form id="loginwindow" onsubmit='validate(text2.value,"username",text1.value,"password")'>
<strong>Login to view!</strong>
<p><strong>User ID:</strong>
   <input type="text" name="text2">
</p>
<p><strong>Password:</strong>
<input type="password" name="text1"><br>
   <input type="submit" value="Check In"/>
</p>

</form>

Как указывали другие, есть и другие проблемы с вашим решением. Но это должно ответить на ваш вопрос.

person Vincent Ramdhanie    schedule 27.10.2008

Конечно, это слишком небезопасно, так как каждый может взломать его за секунду ...

-- единственный псевдобезопасный способ сделать js-логин:

<form action="http://www.mySite.com/" method="post" onsubmit="this.action+=this.theName.value+this.thePassword.value;">
  Name: <input type="text" name="theName"><br>
  Password: <input type="password" name="thePassword"><br>
  <input type="submit" value="Login now">
</form>
person roenving    schedule 27.10.2008

Моя мысль = Огромная дыра в безопасности. Любой может просмотреть имя пользователя и пароль.

Более актуально для вашего вопроса: - У вас происходят два события.

  1. Пользователь нажимает кнопку.
  2. Пользователь нажимает ввод.

Клавиша ввода отправляет форму, но не нажимает кнопку.

Поместив свой код в метод onsubmit формы, код будет запускаться при отправке формы. Изменив тип ввода кнопки для отправки, кнопка отправит форму так же, как кнопка ввода.

Затем ваш код будет работать для обоих событий.

person Ady    schedule 27.10.2008