<script language="javascript">
function check(form){
if(form.user.value==""){
alert("请输入用户名");form.user.focus();return false;
}
if(form.pwd.value==""){
alert("请输入密码");form.pwd.focus();return false;
}
form.submit();
}
html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>博客用户登录</title>
<style type="text/css">
<!--
.style1 {color: #FF0000}
body{ font-size:12px;}
-->
</style>
</head>
<body>
<script language="javascript">
function check(form){
if(form.user.value==""){
alert("请输入用户名");form.user.focus();return false;
}
if(form.pwd.value==""){
alert("请输入密码");form.pwd.focus();return false;
}
form.submit();
}
</script>
<form name="form1" method="post" action="default.php">
<table width="521" height="394" border="0" cellpadding="0" cellspacing="0">
<tr>
<td valign="top" background="images/login.jpg"><table width="521" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="262" height="218"> </td>
<td width="259"> </td>
</tr>
<tr>
<td height="24" align="right">用户名:</td>
<td height="24" align="left"><input name="user" type="text" id="user" size="20"></td>
</tr>
<tr>
<td height="24" align="right">密 码:</td>
<td height="24" align="left"><input name="pwd" type="password" id="pwd" size="20"></td>
</tr>
<tr align="center">
<td height="24" colspan="2"><input type="submit" name="Submit" value="提交" onClick="return check(aa);">
<input type="reset" name="Submit2" value="重填"></td>
</tr>
<tr>
<td height="76" align="right"><span class="style1">超级用户:tsoft<br>
密 码:111 </span></td>
<td><span class="style1"> 普通用户:zts<br>
密 码:000</span></td>
</tr>
</table></td>
</tr>
</table>
</form>
</body>
</html>
onClick="return check(form);" 这里的check(aa),form是实参名称,表单form的name值为form1,实参为什么不用form1,这样能传递值吗?
可以
你要问形参还是问实参啊?
你的代码中定义函数 function check(form){......} 中form是形参,
形参就等于函数内的局部变量,可以取任意名称,在函数执行时会自动声明。
在调用函数时check(aa); aa 是实参,
实参使用时必须在当前的作用域层级中存在。
作用域层级一般情况有当前函数作用域 》 全局作用域(也就是window对象)
你的代码中当前函数作用域 和 全局作用域(也就是window对象)中都没有aa 就会报错。
上面说的是一般情况,但是在html标签中用 onClick="return check(form);" 方式设置的事件所生成的事件函数外会多包上两层或三层作用域。类似于:
with(document) {
with(当前元素所在的form) {//只有当前元素是表单元素,并且当前元素包含在form内才会有这一层作用域
with(当前元素 input) {
当前元素.onClick = function(event){
return check(form);
}
}
}
}
这样在onClick事件函数中访问form关键字时,会先在onClick事件函数作用域中找,没有则往上一层作用域也就是当前元素的作用域中找。还没有则再往上一层中找。所有的作用域都没有时才会到全局作用域(window)中找。
你访问form时,由于当前元素input中就有一个form属性,就获取input元素的form属性作为实参了,
1.形参不用事先声明,可以随意起名,但是最好不要起一些特殊含义的名字。如default
2.onClick="return check(form)" 此处的form是实参,也是当前页面里的HTML DOM Form对象,而form1只是form表单的id属性值,form1也是Form对象的id属性,通过form.id 可以获取到“form1”,但使用form1并不能即刻获取到form对象,要使用对象里的属性/方法,只能使用form 对象。如获取form对象里的user值,就可使用:form.user.value,提交form表单可使用form对象里的方法:form.submit().
如果在当前元素中不止一个form属性,应该如何设置check()实参呢。是不是应该把表单form name作为实参?
这里的form属性指的是input元素的form属性,同一个元素不可能有多个form属性啊
onClick="return check(form);"
就等同
onClick="return check(this.form);" 其中this指向当前input元素
input元素的form属性获取的就是当前元素所在的form元素
我能使用form表单里的name或者id作为实参吗
你写form的name也可以
onClick="return check(form1);"
只不过这个form1是在document元素层作用域中找到的。
等同
onClick="return check(document.form1);"
正常情况建议怎么写呢?
正常情况建议
onClick="return check(document.form1);"
或者用元素id
document.getElementById('元素id')
直接写id也可以,因为有些浏览器中html元素的id是可以当做全局变量使用的。
不过这样对浏览器的兼容性不好,不推荐,使用id还是应该用document.getElementById()
真纠结,感觉两位大佬对我的疑问都很有帮助