Почему моя HTML-форма все еще отправляется, когда я возвращаю false из onsubmit?
Я написал простой скрипт для проверки формы входа в систему следующим образом:
<script type="text/javascript">
function validateLoginForm(){
var idV = document.forms["LoginForm"]["id"].value;
var pwdV = document.forms["LoginForm"]["pwd"].value;
if (idV == null || idV == "" || idV.length < 5) {
alert("user ID must be filled and of more than 4 characters!!");
id.focus();
return false;
}
if (pwdV == null || pwdV == "" || pwdV.length < 5) {
alert("Password must be filled and of more than 4 characters!!");
pwd.focus();
return false;
}
return true;
}
</script>
и назовите это как:
<form name="LoginForm" method="POST" onsubmit="return validateLoginForm()" action="Login" >
.
.
.
.
</form>
проблема в том, что javaScript выдает предупреждение, как я правильно установил, но в конце концов Login
сервлет также вызывается автоматически, что является неправильным..Почему это происходит? Есть решение?
6 ответов
перенаправление на вход происходит, потому что у вас есть ошибка js.
вы не определяете переменную id
и psw
.
поэтому, когда вы попробовать id.focus()
или psw.focus()
- у вас есть ошибка js и возврат true по умолчанию
поэтому добавьте этот код:
var id = document.forms["LoginForm"]["id"];
var pwd = document.forms["LoginForm"]["pwd"];
var idV = document.forms["LoginForm"]["id"].value;
var pwdV = document.forms["LoginForm"]["pwd"].value;
попробуйте это,
<script type="text/javascript">
function validateLoginForm(){
var idV = document.forms["LoginForm"]["id"].value;
var pwdV = document.forms["LoginForm"]["pwd"].value;
var err = '';
if (idV == null || idV == "" || idV.length < 5) {
err = "user ID must be filled and of more than 4 characters!! \n";
document.getElementById("id").focus()
}
if (pwdV == null || pwdV == "" || pwdV.length < 5) {
err = "Password must be filled and of more than 4 characters!! \n";
document.getElementById("pwd").focus()
}
if(err == '')
return true;
else
{
alert(err);
return false;
}
}
</script>
без ввода всего содержимого вашей формы я не могу быть уверен, но я собираюсь сделать хорошую догадку здесь. Я собираюсь сказать, что ваши теги для ваших полей идентификатора пользователя и пароля имеют только атрибуты имени на них?
когда вы имеете дело с формами в HTML, вы должны использовать 'name=' для имен параметров, которые будут переданы в принимающий скрипт. Это то, что дает ваш скрипт ?id=бла & pwd=бла бит в URL или в качестве данных post полезная нагрузка.
однако....
при доступе к значениям с помощью DOM (объектной модели документа), как вы находитесь в своем скрипте, вам нужно иметь элемент, идентифицированный с атрибутом 'id='.
то же самое справедливо для любого элемента в любом месте вашего документа, к которому вам нужно получить доступ, используя сценарий в js.
Если вы также заметили, вы получаете предупреждение, но как-ну, не возвращая false, ваш вызов фокуса также никогда не вызывается, это будет так это приводит к тому, что ваш скрипт прерывается, так как элемент под названием " id " не может быть найден.
добавить id= "id"и id=" pwd"рядом с вашим именем=" id"и name=" pwd " атрибуты во входных тегах, и вы должны найти, что все будет работать, как ожидалось. Например:
<input type="text" name="id" id="id" ... />
на последней ноте я бы рекомендовал вам, однако, переписать эту функцию, используя что-то вроде jQuery, вы найдете модель гораздо более интуитивной и кросс-платформенной.
Я создал минимальный тестовый случай здесь: http://www.pauldwaite.co.uk/test-pages/7723381/
<script>
function pretendValidation(){
alert("Validatation failed!");
return false;
}
</script>
<form action="http://www.google.co.uk/" method="POST" onsubmit="return pretendValidation();">
<input type="submit" value="Submit">
</form>
когда я нажимаю "отправить", предупреждение происходит, и форма не отправляет. Теоретически, ваш код должен работать.
As @Shawty упомянул, у вас может возникнуть проблема с вашей формой HTML. Если вы опубликуете все HTML, мы сможем это проверить.
Лучшая практика: если вы хотите гарантировать, что не отправите форму, даже если ваш Javascript выдает исключение en, вы должны обернуть свой код в блоки try/catch:
<script type="text/javascript">
function validateLoginForm(){
try{
var idV = document.forms["LoginForm"]["id"].value;
var pwdV = document.forms["LoginForm"]["pwd"].value;
if (idV == null || idV == "" || idV.length < 5) {
alert("user ID must be filled and of more than 4 characters!!");
id.focus();
return false;
}
if (pwdV == null || pwdV == "" || pwdV.length < 5) {
alert("Password must be filled and of more than 4 characters!!");
pwd.focus();
return false;
}
}catch(e){
console.log(e);
return false;
}
return true;
}
</script>
ну, как ни странно, моя форма все еще была представлена, даже когда я вернулся false
от меня function
и вернул возврат этой функции в форму onsubmit
... Я даже попробовал:
onsubmit="return false;"
не уверен, что происходит... в любом случае перемещение триггера события в вот!--5--> событие исправило проблему.
обновление: закончилось тем, что код, который я редактировал, имел другой обработчик JS, прикрепленный к onsubmit
событие, поэтому это было игнорируя мой return false;