Почему Firefox 5 отправляет форму на сервер, когда onsubmit = false с внешним javascript? - PullRequest
0 голосов
/ 14 июля 2011

У меня есть форма, которую я хочу проверить, выглядит так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript" src="scripts/validate.js"></script>
</head>
<body>
<form name="frmRegister" method="post" action="register.aspx"  onsubmit="return validate(this);">
    <div>
      <label for="txtUsername">Username:</label>
      <input type="text" name="txtUserName" id="txtUserName" size="12" />
    </div>
    <div>
      <label for="txtPassword">Password: </td></label>
      <input type="password" name="txtPassword" id="txtPassword" size="12" />
    </div>
    <div>
      <label for="txtPassword2">Confirm your password:</label>
      <input type="password" name="txtPassword2" id="txtPassword2" size="12" />
    </div>
    <div>
      <input type="submit" value="Log in"  />
    </div>
</form>
</body>
</html>

и функция проверки во внешнем файле с именем validate, например так:

function validate(form) {
  var returnValue = true;
  var username = form.txtUserName.value;
  var password1 = form.txtPassword.value;
  var password2 = form.txtPassword2.value;

if(username.length < 6) {
  returnValue = false;
  alert("Your username must be at least\n6 characters long.\nPlease try again.");
  frmRegister.txtUserName.focus();
}

if (password1.length < 6) {
  returnValue = false;
  alert("Your password must be at least\n6 characters long.\nPlease try again.");
  frmRegister.txtPassword.value = "";
  frmRegister.txtPassword2.value = "";
  frmRegister.txtPassword.focus();
}

if (password1 != password2) {
  returnValue = false;
  alert("Your password entries did not match.\nPlease try again.");
  frmRegister.txtPassword.value = "";
  frmRegister.txtPassword2.value = "";
  frmRegister.txtPassword.focus();
}
  return returnValue;
}

Но Firefox 5 продолжает отправлять его в register.aspx, даже если форма не проходит тест?

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Вы не определили frmRegister.

Internet Explorer (в зависимости от версии IIRC, от версии и от того, в каком режиме вы находитесь) выбрасывает глобальную переменную для каждого элемента с идентификатором (а некоторые с именем).Другие браузеры этого не сделают.

При попытке выполнить следующие действия:

frmRegister.txtPassword.value = "";

Браузер выдаст ошибку, поскольку frmRegister равен undefined, поэтому не может иметь .txtPassword.

При возникновении ошибки сценарий умирает и оператор return никогда не достигается.

Поскольку return никогда не достигается, отправка не отменяется, и форма отправляетсясервер как обычно.

0 голосов
/ 14 июля 2011

Попробуйте вместо возврата validate (this) вернуть false.Если форма не отправлена, попробуйте вернуть validate (this), но в этой функции, прежде чем возвращать returnValue, попробуйте предупредить ее, чтобы убедиться, что она действительно ложная.Может быть, это из-за ваших фокусирующих элементов.Возможно, вы могли бы сначала вернуть returnValue, но выполните фокусировку с помощью setTimetout ('focus ()', intervalInMillisecons)?

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

Также попробуйте временно удалить DOCTYPE.Иногда творит чудеса.

...