为什么Firefox5在外部javascript的onsubmit=false时将表单发送到服务器?

为什么Firefox5在外部javascript的onsubmit=false时将表单发送到服务器?,javascript,forms,validation,Javascript,Forms,Validation,我有一个要验证的表单,如下所示: <!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

我有一个要验证的表单,如下所示:

<!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>
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;
}

无标题文件
用户名:
密码:
确认您的密码:
以及名为validate的外部文件中的validate函数,如下所示:

<!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>
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;
}
函数验证(表单){
var返回值=真;
var username=form.txtUserName.value;
var password1=form.txtPassword.value;
var password2=form.txtPassword2.value;
如果(username.length<6){
returnValue=false;
警报(“您的用户名必须至少\n6个字符。\n请重试。”);
frmRegister.txtUserName.focus();
}
if(password1.length<6){
returnValue=false;
警报(“您的密码必须至少\n6个字符。\n请重试。”);
frmRegister.txtPassword.value=“”;
frmRegister.txtPassword2.value=“”;
frmRegister.txtPassword.focus();
}
如果(密码1!=密码2){
returnValue=false;
警报(“您的密码输入不匹配。\n请重试。”);
frmRegister.txtPassword.value=“”;
frmRegister.txtPassword2.value=“”;
frmRegister.txtPassword.focus();
}
返回值;
}

但是Firefox 5一直将其发送到register.aspx,即使表单没有通过测试?

尝试,而不是返回validate(这个),返回false。如果表单没有提交,请尝试返回validate(this),但是在该函数中,在实际返回returnValue之前,尝试警告它确保它实际上是false。也许是因为你的专注力。也许您可以首先返回returnValue,但是通过setTimetout('focus()',intervalInMillisecons)进行聚焦吗

另外,在Safari或Chrome等其他浏览器中尝试一下,看看是否能得到同样的结果


另外,尝试暂时删除DOCTYPE。有时会产生奇迹。

您还没有定义
frmRegister

Internet Explorer将(取决于版本,IIRC,以及您是否处于怪癖模式)为每个具有id(以及一些具有名称)的元素释放一个全局变量。其他浏览器不会

当您尝试以下操作时:

frmRegister.txtPassword.value = "";
浏览器将出错,因为
frmRegister
未定义

当它出错时,脚本将终止,并且永远不会到达
return
语句


由于从未到达
return
,因此提交不会被取消,表单将正常发送到服务器

尝试使用
onsubmit=“validate(this);”
是否检查了firebug的
returnValue的值其他浏览器是否正确?通常会有一个javascript错误导致这种行为。您在firebug中检查了它吗?是的,在firebug中检查了,并且returnValue的值为false。这在所有浏览器中都有效:
function validate(){return false;}
删除Doctype触发器怪癖模式,这会导致浏览器之间的不一致。有时它会解决一个错误(在你的代码中,而不是在浏览器中),但几乎总是会导致更多的问题,然后再解决。永远不要在标准模式之外工作。是的,我不喜欢没有doctypeOk的页面,如下所示:form.txtUserName.focus();这必须是使用该参数的最佳方式,或者应该是一个直接进入document.forms的方式,一般来说?
document.forms。form
提供的对象与从submit事件处理程序传递
This
的对象相同。后者通常更易于重用,因此更好。好吧,它在内部工作,因为它知道什么是frmRegister,但我如何使用IE和Chrome?带有全局变量的东西,即使是外部的?IE和Chrome支持传入
this
并使用该变量。好的,IE和Chrome使this=frmRegister并知道它并使用它,但是Firefox也使this=frmRegister但不能使用它